sap.m.Button文本格式化程序

时间:2013-11-28 11:31:10

标签: javascript sapui5

我在SAP UI 5上关注this CRUD示例,我正在尝试重现/了解SAPUI5的工作原理。

我正在试图弄清楚这段代码是如何运作的:

this.createButton = new sap.m.Button({
    icon : "sap-icon://add",
    visible : {
        path : "local>/inEdit",
        formatter : function(inEdit) { return !inEdit; }
    },
    press : [ oCon.createButtonPress, oCon ]
});

createButton视图中创建Home.view.js,并从onInit中的Home.controller.js函数中实例化此模型对象的路径值:

onInit : function(){
    var model = new sap.ui.model.json.JSONModel({
        mode : sap.m.ListMode.None,
        inEdit : false,
        inDelete : false,
        inBatch : false
    });
    this.getView().setModel(model, "local");
}

在创建createButton按钮时,我不明白这段代码是如何工作的:

...
visible : {
    path : "local>/inEdit",
    formatter : function(inEdit) { return !inEdit; }
},
...

visible将一个布尔值作为值,从formatter函数返回,这没关系。我真正得到的是如何,具有两个属性(路径 formatter )的对象将自动“运行” formatter 的函数使用 path 的值作为它自己的inputp参数..我错过了什么吗?

我希望我很清楚,先谢谢

3 个答案:

答案 0 :(得分:3)

bootstrapping脚本元素上有一个属性xx-bindingSyntax。例如:

<script id="sap-ui-bootstrap" type="text/javascript"
        src="lib/sapui5-1.16.3/sap-ui-core.js"
        data-sap-ui-theme="sap_bluecrystal"
        data-sap-ui-xx-bindingSyntax="complex"
        data-sap-ui-libs="sap.ui.commons, sap.viz, sap.m">

在sap-ui-core.js中默认为“simple”。如果将其设置为“complex”,如我的示例所示,UI5构造函数将执行以下代码行:

sap.ui.base.ManagedObject.bindingParser = sap.ui.base.BindingParser.complexParser;

使用该解析器,UI5将查找更复杂的属性定义,例如“可见”。要了解complexParse的工作原理,请打开sap / ui / base / BindingParser.js。

这是UI5的一个很好的补充,它足够优雅,可以接受参数数组。但是,“格式化程序”这个名称有点用词不当。据推测,它起初是一种格式化功能,但对动态可见性等逻辑非常有用。

答案 1 :(得分:0)

您必须区分直接设置属性和使用SAPUI5的数据绑定。

在您的示例中,完成了属性绑定(https://sapui5.hana.ondemand.com/sdk/#docs/guide/BindingProperties.html)。使用了所谓的属性绑定扩展语法。该对象可以包含更多属性,其中包含有关绑定应如何表现的信息。您可以在文档中阅读相关内容。

如果使用数据绑定,则按钮的visible属性绑定到控制器中定义的JSONModel。每次更新模型时,按钮setVisble方法都会自动触发,其值由数据绑定决定。

要了解有关数据绑定在SAPUI5中的工作原理的更多信息,请参阅文档(https://sapui5.hana.ondemand.com/sdk/#docs/guide/GettingStarted.html

答案 2 :(得分:0)

我可以在没有深入了解该主题的框架知识的情况下解释我背后的原则。

无论何时在controls属性和models属性之间建立绑定,都会发生以下情况: 控件将事件侦听器附加到模型,侦听绑定路径下的更改/inEdit。只要该路径下的值发生更改,事件就会触发控件侦听器执行它:

  • 使用新值调用已注册的格式化程序,并将其返回值设置为controls属性
  • 或 - 如果没有提供格式化程序/类型等 - 它直接将新值设置到controls属性

在大多数情况下,属性更改将导致重新呈现控件,您将看到控件显示的新模型值。

如果有人知道的话,请纠正我。