Javascript UI5中数组大小更改后未更新绑定

Javascript UI5中数组大小更改后未更新绑定,javascript,sapui5,Javascript,Sapui5,我需要根据绑定的数组大小启用或禁用按钮 <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 }"/&g

我需要根据绑定的数组大小启用或禁用按钮

<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="{/listOfData}">
    <StandardListItem title="{Name}" />
  </List>
  <Button text="AddSomeData" press=".onPress" />
</mvc:View>
添加数据后,必须启用“需要启用”按钮,但它不会发生


我的表达式绑定有什么问题吗?

因为XMLView表达式绑定是在预处理期间计算的,所以在直接更新模型时不会重新计算

您可以通过使用格式化程序函数来避免此行为,或者在更新模型后通过强制刷新绑定来更新模型:

this.viewModel.refresh(true);

改用
.concat

constmyarray=myClientModel.getProperty('/data');
//而不是myArray.push({/*…*/});
const myNewArray=myArray.concat({/*…*/});//myNewArray!==myArray
myClientModel.setProperty('/data',/*而不是旧的引用:*/myNewArray)
应避免使用
.push
,因为它会操纵原始数组。然而,它在您的案例中不起作用的真正原因是,传递给
setProperty
的引用与旧引用(内部)相同。因此,UI5看不到任何更改,也不会通知任何侦听器

model.refresh(true)
不必要地强制所有绑定(包括聚合绑定)和所有侦听器重新计算所有内容

.concat
另一方面,创建一个新的引用。UI5只通知那些关心更改的侦听器