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
。
模型是空的,这可能是问题的一部分?
答案 0 :(得分:1)
我认为由于你绑定模型的方式和Button的Text属性,因此不会触发更改事件。
由于表达式绑定,已发生ONE-WAY-BINDING,意味着值仅在MODEL中更改,不会在UI中反映出来。见下图:
为了解决这个问题,我手动触发了一个刷新事件,它将更新所有绑定(强制),因此触发了按钮文本的更改事件。
所以,代码:
this.getView().getModel('newModel').getProperty("/").push({});
this.getView().getModel('newModel').refresh(true);
其中newModel是我的命名模型。
然而,在调试时,我发现了两个问题:(
为什么在手动刷新后触发更改事件两次?
如果我这样做,就不应该触发onChange():
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
供公众使用。所以它无论如何都不应该被使用。