SAPUI5基础知识23 - 模型的种类(小结)

news2025/1/23 3:50:46

1. 背景

在前序的学习中,我们学习了SAPUI5的MVC架构中的各个知识点,包括视图的设计,控制器的设计,以及模型的使用。

在企业级应用程序中,对于数据的处理的需求是很大的,在学习更复杂的数据绑定方式之前,让我们再深挖下MVC架构中与数据处理关系最大的部分 - 模型。

2. 概览

SAPUI5中的模型(Model)用于保存数据并提供检索、设置和删除数据的方法,它是数据和控制器之间的桥梁。如果从模型的类型上区分,则可以分为“客户端模型”和“服务器端模型”两种:

  • 客户端模型:数据从本地数据源中获取;所有数据都在客户端上可用,过滤/排序/分组在本地执行(其中,资源模型用于i18n支持;而设备模型是由框架创建,包含有关运行时的设备特定信息)
  • 服务器端模型:数据每次从数据源(后端)获取;只有请求的数据可用,过滤/排序/分组在远程执行
    在这里插入图片描述

从功能上区分,客户端模型和服务器模型适用于不同的场景和数据集:

  • 客户端模型
    • 适用于小数据集
    • 不包含基于服务器的分页或增量加载机制
    • 主要用于处理资源包中的数据,提供不同语言的文本,实现国际化
  • 服务器端模型
    • 适用于大数据集
    • 允许将控件绑定到来自 OData 服务的数据
    • 数据集仅在服务器上可用,客户端仅知道当前可见的行和字段

在这里插入图片描述

3. 示例

3.1 客户端模型

客户端模型是指在客户端(浏览器)中管理和存储数据的模型。常见的客户端模型包括 JSONModelXMLModel

3.1.1 JSONModel

SAPUI5中的JSON Model是一个客户端模型,可以用于在SAPUI5应用程序中处理和操作JSON数据。SAPUI5提供了绑定控件数据到JSON对象的机制,使得当JSON数据改变时,UI控件也会自动更新。

代码示例:

// 创建一个JSON Model实例
var oModel = new sap.ui.model.json.JSONModel();

// 设置JSON数据到模型中
var oData = {
    "employees": [
        { "firstName": "John", "lastName": "Doe" },
        { "firstName": "Anna", "lastName": "Smith" },
        { "firstName": "Peter", "lastName": "Jones" }
    ]
};
oModel.setData(oData);

// 将模型绑定到视图
this.getView().setModel(oModel);

在视图文件中,使用以下方式绑定数据到控件:

<List items="{/employees}">
    <items>
        <ObjectListItem title="{firstName}" intro="{lastName}" />
    </items>
</List>

在上述示例中,我们首先创建了一个JSON Model实例,然后设置了一些JSON数据到模型中。然后,我们将模型绑定到视图。在视图中,我们使用绑定语法将数据绑定到一个列表控件。当JSON数据改变时,列表控件会自动更新。

当然JSON模型中的数据,是可以存储在单独的JSON文件中的,当需要处理模型数据时,可以从JSON文件中加载,如下例:

var oModel = new sap.ui.model.json.JSONModel();
oModel.loadData("mydata.json");
sap.ui.getCore().setModel(oModel);

3.1.2 XMLModel

与JSONModel类似,XMLModel也是一个客户端模型,用于处理XML格式的数据。它可以用于存储和处理来自服务器的XML数据。

代码示例:

var oModel = new sap.ui.model.xml.XMLModel();
oModel.loadData("mydata.xml");
sap.ui.getCore().setModel(oModel);

3.1.3 Device模型

Device模型在SAPUI5中是一个特殊的模型,它不是一个真正的模型,而是一个包含设备相关信息的对象。这些信息包括设备类型(如桌面、平板或手机)、操作系统、浏览器、屏幕尺寸等。Device模型通常用于响应式设计,根据设备的类型和屏幕尺寸来调整UI的布局和行为。

设备模型由框架创建,包含有关运行时的特定于设备的信息,可以使用sap.ui.Device对象来获取设备信息。

Device模型的使用示例如下:

// 检查设备是否是手机
if (sap.ui.Device.system.phone) {
  // 如果是手机,使用简洁布局
  this.getView().byId("myLayout").setSimple(true);
}

// 检查操作系统是否是iOS
if (sap.ui.Device.os.ios) {
  // 如果是iOS,使用iOS样式
  this.getView().addStyleClass("ios-style");
}

// 检查屏幕尺寸
if (sap.ui.Device.resize.width < 500) {
  // 如果屏幕尺寸小于500px,使用小字体
  this.getView().addStyleClass("small-font");
} else {
  // 如果屏幕尺寸大于或等于500px,使用大字体
  this.getView().addStyleClass("large-font");
}

或者,也可以直接通过创建实例,获取device的所有数据:

// 创建一个 DeviceModel 实例
var oDeviceModel = new sap.ui.model.json.JSONModel(sap.ui.Device);

3.1.4 ResourceModel资源模型

在SAPUI5中,资源模型(Resource Model)主要用于处理国际化(i18n)资源文件,通常用于实现多语言支持。资源模型可以加载包含翻译文本的属性文件,并提供一种方便的方式来获取这些文本。

以下是一些使用资源模型的场景:

  • 多语言支持:如果你的应用需要支持多种语言,你可以为每种语言创建一个资源文件,然后使用资源模型来加载相应的文件。
  • 文本复用:如果你的应用中有一些文本在多个地方被复用,你可以将这些文本放在资源文件中,然后使用资源模型来获取这些文本。

以下是使用资源模型的代码示例:

首先,你需要在你的项目中创建一个i18n资源文件,例如i18n.properties

greeting=Hello, {0}!
button=OK

然后,使用SAP.ui.model.resource.ResourceModel类来创建资源模型,并加载资源文件:

var oModel = new sap.ui.model.resource.ResourceModel({
  bundleName: "myapp.i18n.i18n"
});
this.getView().setModel(oModel, "i18n");

可以使用资源模型来获取资源文件中的文本:

var oBundle = this.getView().getModel("i18n").getResourceBundle();
var sGreeting = oBundle.getText("greeting", ["World"]);  // "Hello, World!"

也可以在视图文件中,直接使用这些文本:

<Text text="{i18n>button}" />

在这个例子中,{i18n>button} 是一个绑定表达式,它告诉SAPUI5从名为 “i18n” 的模型中获取键为 “button” 的值。这个值就是我们在i18n.properties文件中定义的本地化字符串。

3.1.4 Message模型

在SAPUI5中,Message模型用于处理消息,例如错误消息、警告消息、信息消息和成功消息。Message模型可以帮助你管理和显示这些消息。

以下是使用Message模型的代码示例:

首先,需要使用SAP.ui.model.message.MessageModel类来创建Message模型:

var oModel = new sap.ui.model.message.MessageModel();
this.getView().setModel(oModel, "message");

然后,使用SAP.ui.core.message.Message类来创建消息,并添加到Message模型中:

var oMessage = new sap.ui.core.message.Message({
  message: "Invalid input",
  type: sap.ui.core.MessageType.Error
});
this.getView().getModel("message").addMessage(oMessage);

最后,使用SAP.m.MessagePopover控件来显示消息:

var oMessagePopover = new sap.m.MessagePopover({
  items: {
    path: "message>/",
    template: new sap.m.MessagePopoverItem({
      description: "{message>message}",
      type: "{message>type}"
    })
  }
});
oMessagePopover.setModel(this.getView().getModel("message"), "message");
oMessagePopover.openBy(this.getView().byId("myButton"));

3.2 服务器模型

服务器模型是指从服务器端获取数据并在客户端进行管理的模型,ODataModel 是最常用的服务器模型。

3.2.1 ODataModel V2

在SAPUI5中,OData模型用于处理OData服务的数据。OData(Open Data Protocol)是一种用于创建和消费RESTful API的开放标准。SAPUI5提供了sap.ui.model.odata.v2.ODataModel类来创建OData模型。

下面是使用ODataModel的一些示例:

使用sap.ui.model.odata.v2.ODataModel类来创建OData模型,并连接到OData服务

var oModel = new sap.ui.model.odata.v2.ODataModel("/my/odata/service");
this.getView().setModel(oModel);

可以使用OData模型来读取数据:

this.getView().getModel().read("/Products", {
  success: function(oData, oResponse) {
    console.log("Read success", oData);
  },
  error: function(oError) {
    console.log("Read error", oError);
  }
});

也可以使用OData模型来创建、更新和删除数据:

// 创建数据
this.getView().getModel().create("/Products", oProduct, {
  success: function(oData, oResponse) {
    console.log("Create success", oData);
  },
  error: function(oError) {
    console.log("Create error", oError);
  }
});

// 更新数据
this.getView().getModel().update("/Products('1')", oProduct, {
  success: function(oData, oResponse) {
    console.log("Update success", oData);
  },
  error: function(oError) {
    console.log("Update error", oError);
  }
});

// 删除数据
this.getView().getModel().remove("/Products('1')", {
  success: function(oData, oResponse) {
    console.log("Delete success", oData);
  },
  error: function(oError) {
    console.log("Delete error", oError);
  }
});

4. 小结

本文进一步总结了SAPUI5中常用模型的种类,并结合使用场景给出类具体的代码示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pr2024苹果(mac)版剪辑软件安装下载(附下载链接)

Adobe Premiere Pro 2024&#xff08;简称PR 2024&#xff09;是一款由Adobe公司开发的专业视频编辑软件&#xff0c;被广泛应用于电影、电视、广告和社交媒体视频的制作。以下是对PR 2024的详细简介&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rN-3kB3KQgn0JswDa…

《学会 SpringMVC 系列 · 剖析初始化》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

win10系统资源监视器磁盘蓝黄线、活动时间代表什么意思?

win10系统资源监视器磁盘蓝黄线、活动时间代表什么意思&#xff1f;在win10系统中磁盘在运行工程中会有不同的数据信息显示&#xff0c;如下图所示&#xff0c;10兆字节/秒、磁盘中蓝线和黄线、活动时间都达标什么意思呢&#xff1f;本文中winwin7小编给大家分享介绍下win10系统…

Python 爬虫入门(六):urllib库的使用方法

Python 爬虫入门&#xff08;六&#xff09;&#xff1a;urllib库的使用方法 前言1. urllib 概述2. urllib.request 模块2.1 发送GET请求2.2 发送POST请求2.3 添加headers2.4 处理异常 3. urllib.error 模块4. urllib.parse 模块4.1 URL解析4.2 URL编码和解码4.3 拼接URL 5. ur…

MySQL主从复制原理及实现教程

MySQL主从复制是一种数据复制技术&#xff0c;通过建立主服务器&#xff08;Master&#xff09;与从服务器&#xff08;Slave&#xff09;之间的数据同步&#xff0c;实现数据的备份、负载均衡和高可用性。 主从复制原理 MySQL binlog(binary log 即二进制日志文件) 主要记录…

Python 如何创建和操作矩阵?

在Python中&#xff0c;矩阵是二维数组的一种常见表示方式&#xff0c;特别是在数学和科学计算领域。矩阵用于表示和操作多维数据&#xff0c;包括数据分析、图像处理、机器学习、以及物理模拟等诸多领域。Python的NumPy库是处理矩阵的主要工具之一。NumPy提供了高效的多维数组…

Deformable Detr

参考&#xff1a; https://search.bilibili.com/all?vt68804228&keywordco-detr&from_sourcewebtop_search&spm_id_from333.1007&search_source5 详解可以看李宏毅的transformer视频。

SAP MM维护采购信息记录只到采购组织层级时候,税码输入报错 MESSAGE 06388

原因&#xff1a;税确认应该是在工厂层级 解决&#xff1a;对06388 消息号进行更改类型改成W

Java-文件操作和IO

文件介绍 文件本身有多重含义,狭义的文件,特指硬盘上的文件(以及保存文件的目录),广义的文件:计算机上的很多硬件设备,软件资源,在操作系统中,都会被视为是"文件" 文件除了有数据内容之外,还有一部分信息,例如文件名,文件类型,文件大小,这些信息可以称作文件的元信…

Redis-管道

面试题 如何优化频繁命令往返造成的性能瓶颈 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤: 1 客户端向服务端发送命令分四步(发送命令-命令排队一命令执行-返回结果)&#xff0c;并监听Socket返回&#xff0c;通常以阻塞模式等待服…

看完这八本AI产品经理书籍,offer收的手软,收藏我这一篇就够了

对于想要深入了解人工智能领域并成为一名优秀的人工智能产品经理的专业人士来说&#xff0c;选择合适的书籍至关重要。下面是我为您精心挑选的八本关于AI产品经理领域的书籍&#xff0c;它们涵盖了从基础知识到高级实践的各个方面&#xff0c;旨在帮助读者构建全面的知识体系。…

情人节变情人劫?三好夫人:为何好男人怕过节

真正的爱&#xff0c;是两颗心灵的相互靠近&#xff0c;是理解、尊重与支持的结晶。———三好夫人 七夕节来源 2024年8月10是中国传统的情人节--七夕。七夕又称七巧节、七姐节、女儿节。妇女们在这一天相约&#xff0c;穿针乞巧&#xff0c;投针验巧&#xff0c;祈求得到智慧…

三十种未授权访问漏洞复现 合集( 一 )

未授权访问漏洞介绍 未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷&#xff0c;导致其他用户可以直接访问&#xff0c;从而引发重要权限可被操作、数据库、网站目录等敏感信息泄露。---->目录遍历 目前主要存在未授权访问漏洞的有:NFS服务&a…

全网最清晰Endnote教程笔记,轻松搞定文献管理以及文献引用

提示&#xff1a;从安装到使用&#xff0c;全网最清晰EndNote教程&#xff0c;轻松搞定文献管理&#xff01;_哔哩哔哩_bilibili 目录 前言 1 导入文献 1.1 文献数据库建立 1.2 正式导入文献 1.3 Endnote导入PDF文献 2 管理文献 3. 引用文献 3.1 Endnote预览参考文献样…

搭建 Rancher 服务,配置k8s集群

1. 前提条件 前提条件&#xff1a; 安装docker&#xff0c;要求版本各节点版本一致。网上还有额外的要求&#xff1a;关闭swap、禁用selinux等等。 2. 搭建 Rancher 服务 直接通过docker命令实现即可&#xff0c;很方便。 docker run -d \--name rancher \--restart unles…

数学建模-数据预处理(数据清洗、标准化)

在数学建模的比赛中&#xff0c;数据分析类的题目中往往我们要面对大量的数据&#xff0c;在给出的数据中&#xff0c;如果数据缺失会影响到判断和后序的操作 这里我们给出一个数据预处理的办法&#xff1a;数据清洗&#xff08;Data Clearning&#xff09;&#xff1a;涉及到…

良心推荐——揭秘10款文件加密软件!(小编真心推荐!好用!)

文件加密不仅能够有效防止敏感数据被非法获取或篡改&#xff0c;还能在数据丢失或被盗时降低损失。 因此&#xff0c;选择一款高效、可靠的文件加密软件成为了企业保障信息安全不可或缺的一环。 今天&#xff0c;小编就为大家揭秘10款良心推荐的文件加密软件&#xff0c;其中首…

BurpSuite教程——渗透测试第一关:BP工具使用

想要学好网络渗透&#xff0c;了解并熟练使用渗透工具是重要的一关。 Burp Suite 是一款广泛使用的网络安全工具&#xff0c;主要用于测试Web应用程序的安全性。它提供了一系列的功能&#xff0c;帮助安全专家和渗透测试人员发现和利用Web应用程序中的安全漏洞。 目录 一、前…

JetBrains GoLand单元测试不支持单个单元测试case执行

譬如函数代码 func AddInt(a, b int32) int32 {return a b } 单元测试代码&#xff1a; func TestAddInt(t *testing.T) {type args struct {a int32b int32}tests : []struct {name stringargs argswant int32}{{name: "add",args: args{a: 1, b: 2},want: 3},{n…

安卓自定义控件

文章目录 引入布局创建自定义控件 引入布局 首先创建一个项目&#xff0c;创建一个空的活动。然后右键单击res/layout创建一个Layout Resource File文件&#xff0c;取名title.xml。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmln…