2

我正在关注SAP UI 5 上的这个 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函数返回,这没关系。我真正不明白的是,一个具有两个属性(pathformatter )的对象将如何使用path的值作为它自己的 inputp 参数自动“运行” formatter的函数。我错过了什么吗?

我希望我足够清楚,在此先感谢

4

3 回答 3

3

引导脚本元素上有一个属性 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 中默认为“简单”。如果设置为“复杂”,如我的示例所示,UI5 构造函数将执行这行代码:

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

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

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

于 2013-12-08T17:02:15.710 回答
0

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

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

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

要了解有关 SAPUI5 中数据绑定如何工作的更多信息,您可以参考文档 ( https://sapui5.hana.ondemand.com/sdk/#docs/guide/GettingStarted.html )

于 2013-11-28T16:18:38.133 回答
0

我可以解释我在这背后假设的原理,而无需对该主题有深入的框架知识。

每当您在控件属性和模型属性之间建立绑定时,都会发生这种情况:控件将事件侦听器附加到模型,以侦听绑定路径下的更改,/inEdit在您的情况下。每当该路径下的值发生更改时,事件都会触发控件侦听器执行并且它:

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

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

如果有人知道更好,请纠正我。

于 2014-01-25T14:40:47.963 回答