UI5_Data Binding

2017-05-19  本文已影响0人  LiuliuZhang

No Data Binding

在页面上创建一个Text控件如下,text为固定文本

new sap.m.Text({text: "Hi, my name is Harry Hawk"}).
        placeAt("content");

Creating Model

创建JSON Model,并通过setModel方法绑定。创建Text控件时可以用{/greetingText}取出值。

sap.ui.getCore().attachInit(function () {
    // Create a JSON model from an object literal
    var oModel = new sap.ui.model.json.JSONModel({
        greetingText: "Hi, my name is Harry Hawk"
    });
    // Assign the model object to the SAPUI5 core
    sap.ui.getCore().setModel(oModel);
    // Create a text UI element that displays a hardcoded text string
    new sap.m.Text({text: "{/greetingText}"})
        .placeAt("content");
});

Two-Way Data Binding

创建控件如下,两个input控件的enabled属性都绑定到Model,同时CheckBox控件的selected属性也绑定到这个Model,当selected取消勾选时,enabled值变为false,因此input控件的enabled属性值同时更新成false,input控件变为不可输入。

    <content>
      <Label text="First Name" class="sapUiSmallMargin" />
      <Input value="{/firstName}" valueLiveUpdate="true" width="200px" enabled="{/enabled}" />
      <Label text="Last Name" class="sapUiSmallMargin" />
      <Input value="{/lastName}" valueLiveUpdate="true" width="200px" enabled="{/enabled}" />
      <CheckBox selected="{/enabled}" text="Enabled" />
    </content>

One-Way Data Binding

创建JSON Model后,oModel.setDefaultBindingMode(sap.ui.model.BindingMode.OneWay);将其设为One-Way Data Binding,数据从模型实例到使用者(通常控件的属性)单向传输,使用者值改变后不返回给模型实例。如下例子中,将selected取消勾选时,enabled模型值没有更新,input控件的enabled属性值仍为true。

Resource Models

创建 /i18n/i18n.properties 文件,在script中创建ResourceModel并绑定。

      var oResourceModel = new sap.ui.model.resource.ResourceModel({
        bundleName : "sap.ui.demo.db.i18n.i18n"
      });
      sap.ui.getCore().setModel(oResourceModel, "i18n");

在xml view中,可以通过text="{i18n>firstName}"来读取。url添加后缀?sap-language=de可以显示相应的语言

Accessing Properties in Hierarchically Structured Models

通过'/'访问Model中的层级 text="{/address/street}\n{/address/zip} {/address/city}\n{/address/country}"

Formatting Values

新建Link控件,parts为传入的参数,是由path对象组成的数组,formatter为触发的事件,带上parts中的参数,.formatMail前面的点号表示当前controller下寻找,没有点号表示寻找全局。

<Link class="sapUiSmallMarginBegin"
        href="{
                parts: [
                    '/firstName',
                    '/lastName'
                ],
                formatter: '.formatMail'
            }"
        text="{i18n>sendEmail}"/>

controller中定义事件的实现方法

    return Controller.extend("sap.ui.demo.db.controller.App", {
        formatMail: function(sFirstName, sLastName) {
            var oBundle = this.getView().getModel("i18n").getResourceBundle();
            return sap.m.URLHelper.normalizeEmail(
                sFirstName + "." + sLastName + "@example.com",
                oBundle.getText("mailSubject", [sFirstName]),
                oBundle.getText("mailBody"));
        }
    });

点击链接,会发送Email


Property Formatting Using Data Types

对于数值类型的value可以直接用下面的方法进行格式化,path为数字与单位的路径,type选择类型,showMeasure: false不显示单位

value="{ parts: [{path: '/salesToDate'}, {path: '/currencyCode'}], 
         type: 'sap.ui.model.type.Currency', 
         formatOptions: {showMeasure: false } }"

Validation Using the Message Manager

对于金额等字段UI5中可以自动进行校验,如有错误通过 Message Manager 显示错误信息。创建view后将其注册到Message Manager

var oView = new sap.ui.core.mvc.XMLView({ viewName : "sap.ui.demo.db.view.App" });
sap.ui.getCore().getMessageManager().registerObject(oView, true);
oView.placeAt("content");

当输入字段有误时,会显示错误信息


Aggregation Binding Using Templates

List 控件为template control。创建Products.json文件

{ "Products": [ {
     "ProductID": 1,
     "ProductName": "Chai",
     "SupplierID": 1,
     "CategoryID": 1,
     "QuantityPerUnit": "10 boxes x 20 bags",
     "UnitPrice": "18.0000",
     "UnitsInStock": 39,
     "UnitsOnOrder": 0,
     "ReorderLevel": 10,
     "Discontinued": false
    }, {
     "ProductID": 2,
     "ProductName": "Chang",
     "SupplierID": 1,
     "CategoryID": 1,
     "QuantityPerUnit": "24 - 12 oz bottles",
     "UnitPrice": "19.0000",
     "UnitsInStock": 17,
     "UnitsOnOrder": 40,
     "ReorderLevel": 25,
     "Discontinued": true
    }]
  }

创建JSON Model加载Products.json,并将其绑定到products Model

var oProductModel = new sap.ui.model.json.JSONModel();
oProductModel.loadData("./model/Products.json");
sap.ui.getCore().setModel(oProductModel, "products");

在view中创建list控件,指定其item为<List headerText="{i18n>productListTitle}" items="{products>/Products}">在items标签中,访问相应字段

<items>
  <ObjectListItem title="{products>ProductName}"

Element Binding

在view中添加显示行信息的控件,在list控件中添加press事件press=".onItemSelected" type="Active",在controller中实现该事件。oEvent.getSource获取点击的item行控件,getBindingContext("products")获取绑定的products上下文,path形式为/Products/0。获取显示详细行的productDetailsPanel控件,bindElement方法绑定model及path。

onItemSelected: function(oEvent) {
            var oSelectedItem = oEvent.getSource();
            var oContext = oSelectedItem.getBindingContext("products");
            var sPath = oContext.getPath();
            var oProductDetailPanel = this.getView().byId("productDetailsPanel");
            oProductDetailPanel.bindElement({ path: sPath, model: "products" });
        }

Expression Binding

添加Expression BindingnumberState="{= ${products>UnitPrice} > ${/priceThreshold} ? 'Error' : 'Success' }"
表达式绑定可以写成{=expression}(Two way)或{:=expression}(One way),表达式中取model数据用${products>UnitPrice}的方式。对于如numberState="{= ${products>UnitPrice} <= ${/priceThreshold} ? 'Success' : 'Error' }"中的<=,不能直接用,需进行转义<=

Aggregation Binding Using a Factory Function

将List改为如下形式,通过factory function来建立item

            <List id="ProductList" headerText="{i18n>productListTitle}" items="{
                path: 'products>/Products',
                factory: '.productListFactory'
            }" />

controller中实现productListFactory,可以通过oContext.getProperty("ProductName")获取属性值,通过如下创建控件

oUIControl = new sap.m.ObjectListItem(sId, {
                    title : sDescription,
                    number : {
                        parts : [ "products>UnitPrice", "/currencyCode" ],
                        type : "sap.ui.model.type.Currency",
                        formatOptions : {
                            showMeasure : false
                        }
                    },
                    numberUnit : {
                        path : "/currencyCode"
                    }
                });

通过如下添加press事件,最后return oUIControl返回创建的控件。

oUIControl.setType(sap.m.ListType.Active);
oUIControl.attachPress(this.onItemSelected, this);
return oUIControl;
上一篇下一篇

猜你喜欢

热点阅读