对于sap.m.Button的getBinding(“text”)没有触发attachChange回调

时间:2017-08-10 11:14:27

标签: sapui5

onInit(): function{
    this._oSelectedTrainingsModel = new sap.ui.model.json.JSONModel([]);
    this.getView().setModel(this._oSelectedTrainingsModel, "selectedTrainings");
},

onAfterRendering: function() {
    this.getView().byId("ViewSelectionButton").getBinding("text").attachChange(this._onTextUpdated, this);
},

在XML视图中,我有这个绑定:

<Button id="ViewSelectionButton"
    class="magnificationPrep"
    icon="sap-icon://cart-full"
    tooltip="Share"
    text="{i18n>viewTrainingsButton} ({= %{selectedTrainings>/}.length })"
    press="handlePressViewSelection"
/>

在控制器的某个位置,会将一个对象添加到_oSelectedTrainingsModel

this._oSelectedTrainingsModel.getProperty("/").push(oNewSelection);

此时,绑定的文本属性已更改,因此我希望调用回调函数_onTextUpdated

模型是空的,这可能是问题的一部分?

...getBinding("text") object in onAfterRendering()

2 个答案:

答案 0 :(得分:1)

我认为由于你绑定模型的方式和Button的Text属性,因此不会触发更改事件。

由于表达式绑定,已发生ONE-WAY-BINDING,意味着值仅在MODEL中更改,不会在UI中反映出来。见下图:

enter image description here

为了解决这个问题,我手动触发了一个刷新事件,它将更新所有绑定(强制),因此触发了按钮文本的更改事件。

所以,代码:

    this.getView().getModel('newModel').getProperty("/").push({});
    this.getView().getModel('newModel').refresh(true);

其中newModel是我的命名模型。

然而,在调试时,我发现了两个问题:(

  1. 为什么在手动刷新后触发更改事件两次?

  2. 如果我这样做,就不应该触发onChange():

  3. this.byId('btn2').setText('Hey1!!')?但它不是。

    我希望它可以帮到你。

答案 1 :(得分:0)

为了通过绑定更新用户界面,必须使用 setProperty,并使用绑定定义中使用的相同路径triggers checkUpdate(&lt; - fires { {1}}事件)。

问题是你通过change手动改变了selectedTrainings - 数组。这绕过了通知UI5自getProperty(...).push doesn't trigger checkUpdate以来的更改。因此..:

而不是

getProperty

待办事项

this._oSelectedTrainingsModel.getProperty("/").push(oNewSelection);
this._oSelectedTrainingsModel.refresh(true);

由于one-way数据绑定,仅此一项就足以更新UI:

  

单向绑定意味着将绑定到视图;模型中的值更改会更新所有相应的绑定和视图(而则相反)。

无需调用const newArray = this._oSelectedTrainingsModel.getProperty("/").concat(oNewSelection); this._oSelectedTrainingsModel.setProperty("/", newArray); ,这表示反模式。这是一个演示:stackoverflow.com/a/48226884

顺便说一下:refresh(true)返回的模块是CompositeBinding,因为涉及多个绑定定义。然而,CompositeBinding does not offer attachChange供公众使用。所以它无论如何都不应该被使用。