Sapui5 模型更改后如何刷新控件?

Sapui5 模型更改后如何刷新控件?,sapui5,Sapui5,我使用构建web应用程序,但我的sap.m.Select控件有问题 在page1.view上,我有两个选择控件,如图所示(感谢他的帮助)。这些select控件是使用ajax调用从数据库填充的 问题是,当我在page2.view上向其中一家公司添加新项目时,我无法使page1.view上的项目选择控件刷新 例如,如果我转到page1.view,在第一个选择控件中选择firm3,然后转到page2.view并将项目4添加到firm3,然后导航回page1.view,我仍然看到选中了firm 3,并且

我使用构建web应用程序,但我的sap.m.Select控件有问题

在page1.view上,我有两个选择控件,如图所示(感谢他的帮助)。这些select控件是使用ajax调用从数据库填充的

问题是,当我在page2.view上向其中一家公司添加新项目时,我无法使page1.view上的项目选择控件刷新

例如,如果我转到page1.view,在第一个选择控件中选择firm3,然后转到page2.view并将项目4添加到firm3,然后导航回page1.view,我仍然看到选中了firm 3,并且在第二个选择控件中只有3个项目可用。 但如果我选择任何其他公司,然后再次选择firm3,我将在选择菜单中看到第四个项目


因此,问题是如何刷新项目选择控件,以便在不重新选择公司的情况下查看新添加的项目?

您需要调用JSONModel的
refresh()
。请运行并检查代码段


sap.ui.controller(“my.own.controller”{
onInit:function(){
风险值数据={
“公司”:[{
“名称”:“firm1”,
“项目”:[{
“名称”:“firm1project1”
}, {
“名称”:“firm1project2”
}, {
“名称”:“firm1project3”
}]
}, {
“名称”:“firm2”,
“项目”:[{
“名称”:“firm2project1”
}, {
“名称”:“firm2project2”
}, {
“名称”:“firm2project3”
}]
}, {
“名称”:“firm3”,
“项目”:[{
“名称”:“firm3project1”
}, {
“名称”:“Firm3项目2”
}, {
“名称”:“Firm3项目3”
}]
}, {
“名称”:“firm4”,
“项目”:[{
“名称”:“Firm4项目1”
}, {
“名称”:“Firm4项目2”
}, {
“名称”:“Firm4项目3”
}]
}]
};
var oModel=new sap.ui.model.json.JSONModel();
oModel.setData(数据);
sap.ui.getCore().setModel(oModel);
//设置第二个下拉框的初始值
var oModel2=new sap.ui.model.json.JSONModel();
oModel2.setData(数据公司[0]);
//为第二个下拉框使用命名数据模型绑定
this.byId(“db2”).setModel(oModel2,“namedmodel”);
},
//第一个下拉框选择更改的事件处理程序
onchange:功能(oEvent){
var bindingContext=oEvent.mpParameters.selectedItem.getBindingContext();
var-oModel=oEvent.getSource().getModel();
var firmData=oModel.getProperty(bindingContext.sPath);
var oModel=new sap.ui.model.json.JSONModel();
oModel.setData(firmData);
this.byId(“db2”).setModel(oModel,“namedmodel”);
},
手按:功能(oEvent){
//将虚拟项目添加到firm1
var projectDropDown=this.byId(“db2”);
var-oModel=projectDropDown.getModel(“namedmodel”);
oModel.oData.projects.push({“name”:“dummy project”});
oModel.refresh();
}
});
var myView=sap.ui.xmlview(“myView”{
viewContent:jQuery('#view1').html()
}); // 
myView.placeAt(“内容”);
myODataModel.refresh(true)

如果它仍然不起作用(对于我来说),您可以使用以下解决方法: 在用新内容填充模型之前,先用空数组或对象填充模型

var ajaxSuccess = function(newArray) {
    myODataModel.setData([])
    myODataModel.setData(newArray)
}

这肯定会刷新控件。

谢谢,它可以工作,尽管我仍然不完全理解“This”关键字是如何工作的。。。为什么这个系统不工作?添加新项目后,我从服务器获取数据,因此在此之后我需要刷新控件。“this”是控制器实例。改用sap.ui.getCore().getModel('projectsModel').refresh();我想它一定是model.refresh(true),因为“true”代表bForceUpdate,而doku表示“bForceUpdate”➡ 更新控件,即使数据未更改“尝试使用PullToRefesh控件调用
push
,然后
refresh
,甚至按照下面的答案中的建议访问内部属性,这几乎是一种反模式。通过更新用户界面。应用程序开发人员不需要调用
refresh
。setData不是一个函数