在ui5

时间:2016-08-19 14:14:29

标签: sapui5 jsonmodel ui5-library

我需要根据数据长度启用或禁用按钮,所以这是我的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或表达式?

2 个答案:

答案 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仅通知那些关心更改的侦听器。