OPEN(SAP) UI5 学习入门系列之三:MVC (上) - 模型
这次我们来一起学习MVC,这个专题分为两个小节,本次主要是总览以及模型,下一次着重会介绍视图以及控制器,因为控制器其实没有太多可以讲的,所以和视图合并在一块。
1 Model View Controller (MVC)的基本概念
MVC,对于大多数人说,这是一个讲烂了的概念。不过,既然这是一个入门系列,还是要稍微讲一讲。
- M 代表Model - 模型
一般用来管理数据层,比如绑定后台数据。 - V 代表View - 视图
一般用来处理展示层,比如具体前端UI的展示。 - C 代表Controller - 控制器
一般用来处理逻辑,可是页面逻辑也可以是协调处理数据的逻辑
不同的程序设计语言,只要涉及到有前端交互的,一般都会有MVC的概念,这个概念是想通的,但是具体 到细节层面还是会有差别,所以下面的内容都是针对UI5的MVC而言。

Figure 1: MVC的关系
MVC最主要的目的是把展示与逻辑、数据分离开来,使得程序更容易阅读、容易理解,从而也更可以维护, 同时,也增加了可扩展性。
视图和控制器一般是1:1对应的,但是也可以创建一个没有视图的控制器,这样的控制器叫做应用控制器, Application Controller ;同时,也可以创建一个没有控制器的视图。
2 UI5中的模型概念
前面讲到,模型的主要作用是提供数据,比如如何从后台数据库获取数据,如何更新后台数据等等。
UI5提供了以下预定义的模型:
- JSON 模型:
属于客户端(client-side model)模型,所以比较适合小型数据集,JSON模型支持双向绑定。
类名:sap.ui.model.json.JSONModel - XML模型:
同样属于客户端模型。
类名:sap.ui.model.xml.XMLModel - Resource模型:
这个比较特殊,它是通过资源包(Resource Bundle)的方式来处理数据,一般我们可以用它来做多语言处理。
类名:sap.ui.model.resource.ResourceModel - OData模型:
属于服务端模型(server-side model),所以必须提供服务端OData的资源URL来绑定到对应的UI5控件。
类名:sap.ui.model.odata.ODataModel
2.1 绑定模式
这里有一个绑定模式(Binding Model)的概念,绑定模式定了数据资源是如何被绑定的,UI5里面绑定模式有三种:
- One Way: 从模型到视图的单向绑定。 我们可以简单的认为单向绑定是一种只读的绑定,如果视图里面的某个字段的值变更了,不会对模型造成影响。如果想要更新数据,就必须要通过控制器来手动控制更新数据到模型,然后这个模型所绑定到视图的所有字段都会自动更新一次。
View(UI: input box value)–manually update–>Model–automatically–>View1
- Two Way: 从模型到视图和视图到模型的双向绑定,如果视图中的某个字段的值变更了,模型会自动更新,同时,这个模型所绑定到视图的其他控件数据。
View(UI: input box value)–automatically–>Model–automatically–>View - One Time: 一次性绑定,有些类似单向绑定,但是如果模型有变更的话,系统不会自动刷新数据,所以一般用来绑定静态文本。
| Model | One-way | Two-way | One-time |
|---|---|---|---|
| Resource model | -- | -- | X |
| JSON model | X | X | X |
| XML model | X | X | X |
| OData model | X | X | X |
2.2 绑定类型
了解了绑定模式,我们再来看绑定类型(Binding Type),简单的说绑定模式要处理的是怎么绑定的问题,绑定类型要处理的是绑定到哪的问题。 UI5中提供了三种绑定类型。
2.2.1 Property Binding
Property Binding允许控件的某些属性直接绑定到模型的数据从而可以自动初始化以及当后台数据变动时可以自动刷新。
定义property Binding有两种方法:
- 通过控件的构造器在
seetings对象中绑定 - 通过控件的
bindProperty方法绑定
一般最常见的方式就是直接利用构造器的settings对象来直接绑定模型,比如:
var oTextField = new sap.ui.commons.TextField({
value: "{/company/name}"
});
稍稍做一点说明,当有多个数据模型绑定到当前控件以及祖先控件时,需要用在绑定的字段之前加上模型名称,比如 "{mymodel>/company/name}" 。
如果需要对这个绑定做更多的定义,可以跟进一步,用以下的扩展语法格式:
var oTextField = new sap.ui.commons.TextField({
value: {
path: "/company/name",
mode: sap.ui.model.BindingMode.OneWay
}
});
这里显式的把绑定的模型字段赋给 path ,注意这里就不需要套上大括号了。
通过控件的 bindProperty 方法则提供了更多的选项,可以让用户在稍后而不是初始化的时候来绑定。
oTextField.bindProperty("value", "/company/name");
以及类似的
oTextField.bindProperty("value", {
path: "value",
type: new sap.ui.model.type.Integer()
});
有一些控件做了进一步的封装,比如文本框,由于 value 是经常需要用来绑定模型的属性,所以直接提供了 bindValue 方法以方便使用。
oTextField.bindValue("/company/name");
当需要对绑定的字段做更多的处理,而不是简单的一对一绑定时,UI5还提供了 formatter 这个属性方法,用法如下:
oTextField.bindProperty("value", "/company/title", function(sValue) {
return sValue && sValue.toUpperCase();
});
oControl = new sap.ui.commons.TextField({
value: {
path:"/company/revenue",
formatter: function(fValue) {
if (fValue) {
return "> " + Math.floor(fValue/1000000) + "M";
}
return "0";
}
}
})
例子中分别提供了用构造器的方法和用 bindProperty 的方法来对要绑定的字段做format的示例。
2.2.2 Aggregation Binding
Aggregation binding主要是用来绑定子控件,对应的模型数据的结构也必须符合一定的树状结构关系。
同样,和Property Binding类似,可以通过控件构造器的 settings 对象或者是bindAggregation 方法来绑定模型, 但是有一点不同的是,Aggregation Binding需要指定所谓的 template ,这是因为Property Binding是一个数据条目绑定到一个控件的字段,属于一对一的绑定,而Aggregation Binding,则是一组数据绑定到一组控件,比如将多个销售订单绑定到一个表控件的多个item中,属于一个数组到另一个数组的绑定。 这个所谓的 template 其实就是我们创建一个item,然后系统在render的时候会参照我们创建的这个item,拷贝多个相同的items并绑定对应的数据。可以想象成两个数组,一个是数据数组,一个是Item控件数组,数据已经确定了,但是系统不知道需要创建哪个Item来绑定数据,需要我们帮它创建一个,接下来,系统就会创建和数据数组相同数量的Item控件,并且绑定和数据数组相同索引的数据。
var oItemTemplate = new sap.ui.core.ListItem({text:"{name}"});
var oComboBox = new sap.ui.commons.ComboBox({
items: {
path: "/company/contacts",
template: oItemTemplate
}
});
或者通过方法调用来绑定:
oComboBox.bindAggregation("items", "/company/contacts", new sap.ui.core.ListItem({text:"{name}"}));
2.2.3 Element Binding
Element Binding可以允许我们把模型数据的某个特定的对象绑定到一个控件上(不是控件的某个属性),从而我们可以在控件的 property 或者 aggregation 中直接使用绑定到这一级的模型的下级对象,换句话说,允许我们在绑定数据的时候使用相对路径的方式。
譬如:
oControl.bindElement("/company");
oControl.bindProperty("value", "name");
Element Binding使用场景比较简单,这里就不多说了。
3 分析与总结
本次我们学习了UI5中的模型的概念、类型以及如何使用。 作为一套前端UI库,SAP的重点其实还是在于企业级的数据交互与展示,所以数据模型以及数据绑定就显得尤为重要,后面希望有机会可以一起探讨后端模型的输出,比如Netweaver以及HANA中是如何提供这些数据模型的。
OPEN(SAP) UI5 学习入门系列之三:MVC (上) - 模型的更多相关文章
- OPEN(SAP) UI5 学习入门系列之三:MVC (下) - 视图与控制器
继续来学习UI5的MVC模型吧,这次我们来探讨视图与控制器. 1 视图 在MVC中,视图用来定义和渲染UI.在UI5中,视图的类型是可以自定义的,除了以下预定义的四种视图类型之外,你也可以定制自己的视 ...
- OPEN(SAP) UI5 学习入门系列之四:更好的入门系列-官方Walkthrough
好久没有更新了,实在不知道应该写一些什么内容,因为作为入门系列,实际上应该更多的是操作而不是理论,而在UI5 SDK中的EXPLORER里面有着各种控件的用法,所以在这里也没有必要再来一遍,还是看官方 ...
- OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(下)
1 UI5代码结构 上一次我们一起用了20秒的时间完成一个UI5版的Hello World.应用打开后有一个按钮,按钮的文字是Hello World,点击这个按钮之后,按钮会慢慢的消失掉(Fade o ...
- OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(上)
这篇博文难产了很久,原来是打算一周更新一篇的,上周原计划写MVC,但是写了一半,发现带入了太多的细节,不太符合这个入门系列的主题. 当我们学习一个新的技能的时候,如果一开始就面对大量的细节,很容易陷入 ...
- [转]OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(上)
本文转自:http://www.cnblogs.com/qianmarv/p/4671394.html 1 扫盲 什么是SAP Fiori? 了解SAP UI5必须要从SAP Fiori开始,两者概念 ...
- OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(上)
什么是SAP Fiori? 了解SAP UI5必须要从SAP Fiori开始,两者概念经常被混淆,而两者也确实有着非常紧密的关系. 用过SAP的同学们都对SAP的传统的界面(SAP GUI)表示“呵呵 ...
- OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(下)
上期我们完成了一个简单的主从页面,但是页面是静态的,不能交互,功能也很简单,只有一个销售订单的列表. 我们今天就一鼓作气把代码全都写完,由于本次的代码量较大,所以只对重点代码部分进行讲解. 具体每个文 ...
- 用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署
用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署 这是微软官方SignalR 2.0教程Getting Started with En ...
- 6. oracle学习入门系列之六 模式
oracle学习入门系列之六 模式 上篇咱们学习记录了ORACLE数据库中的数据库结构.内存结构和进程等.篇幅 蛤蟆感觉偏多了.这次要休整下,每次笔记不宜太多,不然与书籍有何差别. 我们要保证的是每次 ...
随机推荐
- ubuntu下wget的配置文件在哪里
答:/etc/wgetrc 这个文件里可以指定代理,如: http_proxy = http://myproxy.com:8080
- PHP 根据IP地址获取所在城市
header('Content-Type:text/html;Charset=utf-8'); function GetIp(){ $realip = ''; $unknown = 'unknown' ...
- Memcached prepend 命令
Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 . 语法: prepend 命令的基本语法格式如下: prepend key flags e ...
- Servlet与线程安全
先说结论:servlet不是线程安全的. servlet运行过程 Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: ①Web服务器首先检查是否已经装载并创建了 ...
- spring mvc: 多动作控制器(Controller下面实现多个访问的方法)MultiActionController / BeanNameUrlHandlerMapping
spring mvc: 多动作控制器(Controller下面实现多个访问的方法) 比如我的控制器是UserController.java,下面有home, add, remove等多个方法 访问地址 ...
- android 命令行签名apk文件
签名apk 1.将apk格式改为zip格式包,然后删除原来apk里面的META-INF文件夹,之后改回apk文件格式 2.cmd命令行: jarsigner -verbose -keystore C: ...
- 2-6-搭建FTP服务器实现文件共享
---------------------------------------------- 大纲: FTP服务:(文件传输协议---> File Transfer Protocol) 常见FT ...
- iptables详解(11):iptables之网络防火墙
我们一起来回顾一下之前的知识,在第一篇介绍iptables的文章中,我们就描述过防火墙的概念,我们说过,防火墙从逻辑上讲,可以分为主机防火墙与网络防火墙. 主机防火墙:针对于单个主机进行防护. 网络防 ...
- JS中将对象转化为数组
前言 其实这本来应该是一个很基础的问题了,但我之做一想记录一下是因为之前因为对象转数组的时候卡住了后来弄了出来,但最近再遇到这个问题时竟然又卡主了,所以,关于这个问题,如何把一个对象{'未完成':5, ...
- 010PHP基础知识——运算符(三)
<?php /** * 位运算符: * 1:&按位与:左右两边的数,同位都为1,返回是1,否则返回是0 */ /*$a = 5; $b = 6; $a = decbin($a);//10 ...