0

0

SAPUI5 JSONModel:数据操作与非持久化特性解析

聖光之護

聖光之護

发布时间:2025-07-18 15:48:19

|

686人浏览过

|

来源于php中文网

原创

SAPUI5 JSONModel:数据操作与非持久化特性解析

本文深入探讨SAPUI5中JSONModel的数据操作机制及其非持久化特性。JSONModel作为客户端模型,主要用于在内存中管理和绑定UI数据。它从JSON文件加载初始数据,支持双向绑定以实时更新UI,但任何通过代码或用户交互对模型数据的修改都仅限于当前内存,不会自动回写到原始JSON文件,因此数据在应用刷新后会丢失。理解这一核心特性对于正确设计SAPUI5应用的数据流至关重要。

1. SAPUI5 JSONModel 概述

sapui5 中的 jsonmodel 是一种客户端模型,用于在前端应用程序的内存中管理数据。它特别适合处理结构简单、数据量较小且不需要与后端服务器进行复杂交互的场景。jsonmodel 可以从本地 json 文件、字符串或 javascript 对象中加载数据,并支持数据的双向绑定,使得 ui 控件能够实时反映模型数据的变化,反之亦然。

在 manifest.json 文件中,JSONModel 通常这样配置,指向一个本地 JSON 文件作为其初始数据源:

"models": {
     "employee": {
         "type": "sap.ui.model.json.JSONModel",
         "uri": "Employees.json" // 从 Employees.json 文件加载初始数据
     }
}

这意味着当应用启动时,employee 模型会读取 Employees.json 文件的内容,并将其加载到内存中。

2. JSONModel 的数据生命周期与非持久化特性

理解 JSONModel 的核心在于其“内存模型”的本质。当 JSONModel 从一个 JSON 文件(例如 Employees.json)加载数据时,它仅仅是将该文件的内容读取到应用程序的内存中,形成一个数据副本。此后,所有对 JSONModel 数据的操作(如通过 setProperty 方法或双向绑定引起的修改)都只发生在内存中的这个数据副本上。

关键特性:

  • 初始加载:JSON 文件仅作为 JSONModel 的初始数据源。
  • 内存操作:所有数据变更都只在应用程序运行时的内存中进行。
  • 非持久化:JSONModel 不会将内存中的数据变更自动回写(保存)到原始的 JSON 文件中。这意味着,一旦用户刷新页面、关闭浏览器或应用程序重新加载,所有在运行时对 JSONModel 数据的修改都将丢失,因为它们从未被写入到文件系统中。

3. 示例代码分析与模型更新机制

让我们分析提供的代码片段,以更好地理解 JSONModel 的工作方式。

3.1 视图 (EmployeeForm.view.xml)

视图定义了一个表单,其中的输入字段通过数据绑定指向一个模型:

<Input value="{/first_name}" width="200px" />
<Input value="{/last_name}" width="200px" />
<!-- ... 其他字段 ... -->

这里的 {/first_name} 等绑定表达式,默认绑定到当前视图设置的默认模型。

3.2 控制器 (EmployeeForm.controller.js)

飞书多维表格
飞书多维表格

表格形态的AI工作流搭建工具,支持批量化的AI创作与分析任务,接入DeepSeek R1满血版

下载
  • onInit 方法

    onInit: function () {
        var model = this.getOwnerComponent().getModel("employee"); // 获取组件级别的 "employee" 模型
        var modelLength = model.oData.Employees.length + 1; // 计算新ID
        var oModel = new JSONModel({ // 创建一个新的 JSONModel 实例
            id: modelLength,
            first_name: "",
            last_name: "",
            email: "",
            gender: "",
            ip_address: "",
            status: "work"
        });
        this.getView().setModel(oModel); // 将新创建的 oModel 设置为视图的默认模型
    }

    在 onInit 中,控制器首先获取了 manifest.json 中定义的组件级别的 employee 模型,用于计算新条目的 ID。然后,它创建了一个全新的 JSONModel 实例,并将其设置为了当前视图的默认模型。这意味着表单中的输入字段(如 {/first_name})现在绑定的是这个新创建的、空的模型实例,而不是组件级别的 employee 模型。

  • onSaveEmployee 方法

    onSaveEmployee: function () {
        // 获取视图默认模型中的数据(即用户在表单中输入的新数据)
        var newItem = this.getView().getModel().oData; 
        // 获取组件级别的 "employee" 模型(即加载自 Employees.json 的模型)
        var oModel = this.getOwnerComponent().getModel("employee"); 
        // 将新条目添加到组件级别的 "employee" 模型的 Employees 数组中
        oModel.setProperty("/Employees", oModel.getProperty("/Employees").concat(newItem));
        // 此时,组件级别的 "employee" 模型在内存中已经被更新
    }

    onSaveEmployee 方法的逻辑是正确的,它成功地将用户通过表单输入的新数据(从视图的默认模型中获取)添加到了组件级别的 employee 模型的 /Employees 路径下。这意味着,在当前应用程序的运行周期内,组件的 employee 模型确实包含了新添加的条目。如果此时有一个列表或其他 UI 元素绑定到 employee 模型的 /Employees 路径,它将立即显示新添加的数据。

为什么数据没有“保存”到文件?

问题在于,oModel.setProperty() 仅仅修改了内存中的 JavaScript 对象。JSONModel 并没有内置的机制来监听这些内存变化,并将它们自动同步回其初始加载来源(即 Employees.json 文件)。文件系统操作(如写入文件)通常需要后端服务器的支持,或者在客户端使用更高级的浏览器 API(如 File System Access API 或 IndexedDB)配合用户授权才能实现。

4. 理解非持久化的影响与适用场景

  • 数据丢失:由于 JSONModel 不具备回写能力,用户在表单中输入并保存的数据,在应用程序刷新或重新加载后,将完全丢失。这对于需要长期存储或跨会话访问的数据来说是不可接受的。
  • 适用场景
    • 静态数据展示:例如配置信息、下拉列表选项等,这些数据在应用生命周期内通常不变。
    • 临时 UI 状态:如用户在表单中输入但尚未提交的数据、UI 控件的临时可见性状态等。
    • 演示或原型应用:无需后端支持,快速展示前端交互效果。
    • 数据缓存:从后端获取数据后,在前端进行临时缓存,以提高性能。

5. 实现数据持久化的策略

如果应用程序需要将用户输入的数据持久化,即在刷新后依然存在,那么必须将数据发送到后端服务器进行存储。SAPUI5 提供了多种方式来实现这一点:

  • 使用 ODataModel: ODataModel 是 SAPUI5 中用于与 OData 服务交互的专用模型。OData 协议支持数据的增、删、改、查(CRUD)操作。通过 ODataModel,开发者可以直接调用 create、update、remove 等方法,将数据变更提交到后端 OData 服务,由后端负责数据的持久化。这是 SAPUI5 应用中最常见的持久化方式。

    // 示例:使用 ODataModel 创建新实体
    var oODataModel = this.getOwnerComponent().getModel("yourODataModelName");
    var oNewEmployeeData = {
        FirstName: newItem.first_name,
        LastName: newItem.last_name,
        // ... 其他字段
    };
    oODataModel.create("/Employees", oNewEmployeeData, {
        success: function(oData, oResponse) {
            sap.m.MessageToast.show("员工信息已成功保存到后端!");
            // 可以在此处刷新相关列表或导航
        },
        error: function(oError) {
            sap.m.MessageToast.show("保存失败:" + oError.message);
        }
    });
  • 自定义 AJAX 请求: 对于非 OData 的 RESTful API,可以使用 sap.ui.core.Fetch (或 jQuery.ajax) 发送 HTTP 请求(POST/PUT)将数据提交到后端服务器。

    // 示例:使用 Fetch API 发送 POST 请求
    fetch('/api/employees', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(newItem)
    })
    .then(response => response.json())
    .then(data => {
        sap.m.MessageToast.show("员工信息已成功保存到后端!");
        // 可以在此处刷新相关列表或导航
    })
    .catch(error => {
        sap.m.MessageToast.show("保存失败:" + error);
    });
  • 客户端本地存储: 对于仅需在客户端持久化数据(例如用户偏好设置、离线数据缓存等),可以使用浏览器提供的 localStorage 或 IndexedDB。但这仅限于当前浏览器,数据不会同步到服务器。

6. 注意事项与最佳实践

  • 明确模型用途:在开发之初,明确数据是仅用于 UI 展示和临时操作(JSONModel),还是需要与后端交互并持久化(ODataModel 或自定义服务调用)。
  • 分离职责:将前端 UI 逻辑与后端数据持久化逻辑清晰分离。前端负责数据绑定和用户交互,后端负责数据存储和业务逻辑。
  • 用户反馈:当数据提交到后端时,务必提供适当的用户反馈(例如加载指示器、成功/失败消息),以提升用户体验。

7. 总结

SAPUI5 中的 JSONModel 是一个强大且易于使用的客户端数据模型,特别适用于管理内存中的临时数据和实现简单的 UI 绑定。然而,它不具备将数据变更自动回写到文件系统的能力。要实现数据的持久化,开发者需要利用 ODataModel 或自定义 AJAX 请求将数据发送到后端服务器进行存储。正确理解 JSONModel 的这一核心特性,是构建健壮且符合业务需求的 SAPUI5 应用程序的关键一步。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

179

2025.11.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

455

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

156

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

406

2023.11.10

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何进行WebSocket调试
如何进行WebSocket调试

共1课时 | 0.1万人学习

TypeScript全面解读课程
TypeScript全面解读课程

共26课时 | 5.1万人学习

前端工程化(ES6模块化和webpack打包)
前端工程化(ES6模块化和webpack打包)

共24课时 | 5.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号