我需要根据数据长度启用或禁用按钮,所以这是我的XML视图
<mvc:View
xmlns="sap.m"
xmlns:mvc="sap.ui.core.mvc"
xmlns:core="sap.ui.core"
height="100%"
controllerName="test.controller.expbind">
<Button text="Need to Enable" enabled="{= ${/listOfData}.length>0 }"/>
<List headerText="Data" items="{
path: '/listOfData'
}" >
<StandardListItem title="{Name}"/>
</List>
<Button text="AddSomeData" press="onPress" />
</mvc:View>
在控制器init方法中,init模型和onPress我将一些数据添加到模型
onInit: function() {
this.viewModel = new JSONModel({
listOfData : []
});
this.getView().setModel(this.viewModel);
},
onPress : function()
{
var existingdata = this.viewModel.getProperty('/listOfData');
existingdata.push({Name:"New"});
this.viewModel.setProperty('/listOfData',existingdata);
}
添加数据后,需要启用按钮必须启用,但不会发生
任何问题都是bind或表达式?
答案 0 :(得分:1)
由于XMLView表达式绑定是在预处理期间计算的,因此在直接更新模型时不会重新计算。
您可以使用格式化程序功能来避免此行为,或者在更新模型后使用强制刷新绑定来更新模型:
this.viewModel.refresh(true);
答案 1 :(得分:1)
改为使用 .concat
api 。
const myArray = myClientModel.getProperty('/data');
// instead of myArray.push({/*...*/});
const myNewArray = myArray.concat({/*...*/}); // myNewArray !== myArray
myClientModel.setProperty('/data', /*instead of the old reference:*/myNewArray);
应避免使用 .push
,因为它会操纵导致side-effects的原始数组。但是,在您的情况下不起作用的真正原因是因为传递给setProperty
的引用与旧引用(内部compared with ===
within deepEqual()
)相同。因此,UI5看不到任何变化,也不会通知任何侦听器。
model.refresh(true)
不必要地强制所有绑定(包括聚合绑定)和所有侦听器重新计算所有内容。
.concat
创建一个新参考。然后,UI5仅通知那些关心更改的侦听器。