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–> View 1
  • Two Way: 从模型到视图和视图到模型的双向绑定,如果视图中的某个字段的值变更了,模型会自动更新,同时,这个模型所绑定到视图的其他控件数据。
    View(UI: input box value) –automatically–> Model –automatically–> View
  • One Time: 一次性绑定,有些类似单向绑定,但是如果模型有变更的话,系统不会自动刷新数据,所以一般用来绑定静态文本。
Table 1: 模型以及相应支持的绑定模式
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中是如何提供这些数据模型的。

Footnotes:

1

Refer to https://www.youtube.com/watch?v=vY5_ifnvDa8 at 7:02.

时间: 2024-08-28 03:41:48

OPEN(SAP) UI5 学习入门系列之三:MVC (上) - 模型的相关文章

OPEN(SAP) UI5 学习入门系列之三:MVC (下) - 视图与控制器

继续来学习UI5的MVC模型吧,这次我们来探讨视图与控制器. 1 视图 在MVC中,视图用来定义和渲染UI.在UI5中,视图的类型是可以自定义的,除了以下预定义的四种视图类型之外,你也可以定制自己的视图类型. 预定义的四种视图类型如下: XML view JSON view JS view HTML view 如果你想定义自己的视图类型,可以通过扩展 sap.ui.core.mvc.View 这个基类来实现. 1.1 视图的加载 视图可以通过异步(async)或者同步(sync)的方式加载,默认

OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(下)

1 UI5代码结构 上一次我们一起用了20秒的时间完成一个UI5版的Hello World.应用打开后有一个按钮,按钮的文字是Hello World,点击这个按钮之后,按钮会慢慢的消失掉(Fade out). 那我们这次就来看一看为了实现这么一个简单的功能,OpenUI5框架至少需要提供哪些内容,或者说我们通过这么一个简单的应用来看一下一个最简单的UI5的应用程序的结构. HTML部分应该不用多说,我们只看和UI5相关的代码,第一部分我们称为Bootstrap,包含以下代码段: <!-- 1.)

OPEN(SAP) UI5 学习入门系列之四:更好的入门系列-官方Walkthrough

好久没有更新了,实在不知道应该写一些什么内容,因为作为入门系列,实际上应该更多的是操作而不是理论,而在UI5 SDK中的EXPLORER里面有着各种控件的用法,所以在这里也没有必要再来一遍,还是看官方的用法更地道. 看一下基于最新的库所推荐的项目结构. 另外,我觉得对于初学者来说是一个非常好的消息,就是UI5版本从1.28更新到1.30以及更高之后,Tutorial系列有了重大更新,之前的Get Started->Tutorials->Application Best Practice现在改为

OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习之一

这篇博文难产了很久,原来是打算一周更新一篇的,上周原计划写MVC,但是写了一半,发现带入了太多的细节,不太符合这个入门系列的主题. 当我们学习一个新的技能的时候,如果一开始就面对大量的细节,很容易陷入其中而只见树木不见森林,所以最后我想我们还是先按照开发文档的节奏,一起来做UI5的最佳实践练习.在练习中对常用的一些控件以及API有一个直观的感受,如果需要细节的信息再去查文档. 这个最佳实践练习的子系列又会分为若干篇,但是不会完全按照Tutorial里面的章节来分,因为我希望每一篇都是都是一个完整

OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(上)

什么是SAP Fiori? 了解SAP UI5必须要从SAP Fiori开始,两者概念经常被混淆,而两者也确实有着非常紧密的关系. 用过SAP的同学们都对SAP的传统的界面(SAP GUI)表示"呵呵",其实传统的SAP GUI的界面功能还是很强大的,但是对于一个新用户来说,学会使用这套界面就需要花上一两 周的时间,所以SAP入门的第一步就是学会使用SAP GUI.此外,传统的SAP GUI只能在Windows和Mac上使用,对于移动端用户没有直接的解决方案,WEBGUI的体验也非常不

oracle学习入门系列之三Unix、Linux历史及基础

终于翻过了前面两篇,喝杯咖啡提下神,咱们继续前行.这次我们要进行操作系统方面知识了,考虑到当前时间上操作系统的多样性.变化性等,蛤蟆斟酌再三,决定还是Unix/Linux比较符合我们的实际. 开始之前不得不又提几个问题: 1.  Unix 从哪里来 2.  Linux从哪里来 3.  Unix/Linux什么关系 4.  怎么入手这系统 哎呀,看见这些问题蛤蟆就有点老激动了,最喜欢唠嗑的就是这些鸡皮蒜毛的事情了.让我们赶紧开始吧~~不急,留个邮箱先 本人邮箱:[email protected]

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署

这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第五篇:MVC程序中实体框架的Code First迁移和部署 原文:Code First Migrations and Deployment with the Entity Framework in an ASP.NET MVC Application 译文版权所有,谢绝全文转载--但您可以在您的网站上添加到该教程的

oracle学习入门系列之二 数据库基础知识

oracle学习入门系列之二 数据库基础知识 本篇蛤蟆要梳理下那些被淡忘的数据库基础知识,也许根本就没被人记住过.不管是哪种情况,该记住的必须记住,记不住就把他记下来吧. 首先问几个问题如下: 数据库基础知识是什么? 好吧,蛤蟆直接吐后而不亡,看目录开始吧. 本人邮箱:[email protected] 微信公众号:HopToad 欢迎各界交流 1      基本概念 概念就是概念,大伙对这些名词不要死磕,但是对定义一定要理解,理解方能领悟,领悟方能运用自如后创新. 1.1      数据 数据

oracle学习入门系列之一 数据库发展与历史

oracle学习入门系列之一 数据库发展与历史 这个oracle学习入门系列是根据本人工作中的一些笔记.项目进行回忆.整理.一方面是自己知识积累,便于技能提升:另一方面是和小伙伴们共进退互通有无,做一个爱分享的好公民.当然最后也夹杂着自己的一个小心愿,改掉自己重理不重文的臭毛病.想想读书考试的时候,当时如果语文英语多个几分,现在可能就不会落到如此...(咳咳~~),做IT也挺好.那就这样开场白切入吧. 既然学习数据库,就不能不抛几个问题了. 1.        为什么需要数据库,什么是数据库 2