Main.view.xml:
<ObjectHeader
id="objectHeader"
title="{name}"
intro="{id}">
<headerContainer>
<IconTabBar
id="tabBar"
items="{
path: 'assigned',
parameters: {expand: 'b, c'}
}"
select="onTabBarSelect">
</IconTabBar>
</headerContainer>
</ObjectHeader>
Main.controller.js
onMasterSelectionChange : function (sPath) {
var oSource = oEvent.getParameter("listItem") || oEvent.getSource(),
// sPath = "/ASet('d')"
sPath = oSource.getBindingContext().getPath(),
oObjectHeader = this.byId("objectHeader");
oObjectHeader.bindElement(sPath);
this._oModel.attachEventOnce("requestCompleted", function(oEvent) {
var oTabBar = this.byId("TabBar");
oFirstListItem = oTabBar.getItems()[0],
sObjectId = oFirstListItem.getBindingContext().getProperty("id"),
sDPath = "/DSet('" + sObjectId + "')";
this._getControls(sDPath);
}, this);
}
我发现了一个奇怪的行为:当我更改主列表选择时,有时网络会显示&#34; / ASet /已分配&#34;呼叫,但有时会没有呼叫,导致requestCompleted
没有被解雇。
根据:SAPUI5 - bindElement doesn't work the second time,
如果您使用相同路径两次调用bindElement,则第二次实际上不会触发新调用以获取新数据,因为路径没有变化。
但我相信这是不同的道路。有什么办法可以触发这个电话吗?
顺便说一句
oObjectHeader.bindElement({
path : sPath,
events: {
change : function (oData, test) {
},
dataRequested : function (oData) {
},
dataReceived: function (oData) {
}
}
});
每次单击主列表时都会触发 change
,但永远不会调用dataRequested
和dataReceived
。
答案 0 :(得分:1)
我知道这是一篇过时的文章,但实际上您可以通过刷新其bindElement
事件中的绑定来触发change
的网络调用。
this.getView().bindElement({
path: "model>/" + sContextPath,
events: {
change: function (oEvent) {
// Get the context binding object
var oContextBinding = oEvent.getSource();
// Refresh the binding.
// This triggers a network call.
oContextBinding.refresh(false);
}.bind(this)
}
});
刷新绑定会触发网络呼叫。另外,将bForceUpdate
的{{1}}标志设置为refresh
,以便仅在APIs中提到的数据发生变化的情况下才更新UI。 / p>
答案 1 :(得分:0)
如果你的ODataModel已经加载sPath
下的数据(签入myODataModel.oData
),它将不会再次加载该数据。因此,dataRequested
/ dataReceived
不会触发。
但无论数据是否存在,只要路径发生变化,change
就会触发。
答案 2 :(得分:0)
通过bindElement
&amp; change
替换oModel.read
,我找到了解决办法......
onMasterSelectionChange : function (sPath) {
var oSource = oEvent.getParameter("listItem") || oEvent.getSource(),
// sPath = "/ASet('d')"
sPath = oSource.getBindingContext().getPath(),
oObjectHeader = this.byId("objectHeader");
oObjectHeader.bindElement({
path : sPath,
events: {
change : this._onBindingChange.bind(this, sPath)
}
})
},
_onBindingChange : function(sPath) {
this._oModel.read(sPath + "/assigned", {
urlParameters: {
"$expand": "b, c"
},
success: function(oData) {
var aAssigmentSet = oData.results,
oViewModel = this.getModel("viewModel"),
oTabBar = this.byId("hazardTabBar");
oViewModel.setProperty("/aAssigmentSet", aAssigmentSet);
oTabBar.bindAggregation("items",
"viewModel>/aAssigmentSet",
new sap.m.IconTabFilter({
key: "{viewModel>id}",
tooltip : "{viewModel>id}",
text : {
parts: [{path: "viewModel>b/name"},
{path: "viewModel>c/type"}],
formatter : function(name, type) {
var sType = type.split(".");
return name + " (" + sType[sType.length - 1] + ")";
}
}
})
);
if (oTabBar.getItems().length > 0) {
var sSelectedTabKey;
sSelectedTabKey = oTabBar.getItems()[0].getKey();
oTabBar.fireSelect({selectedKey: sSelectedTabKey});
}
}.bind(this),
error: this.errorCallback.bind(this)
});
},
onTabBarSelect : function(oEvent) {
var sRiskAssignmentPath = "/AssignmentSet('" + oEvent.getParameter("selectedKey") + "')";
this._oModel.read(AssignmentSet + "/assignedAssignedControls", {
...
});
}
答案 3 :(得分:0)
我认为实现此目标的正确方法是使用invalidate-Method形式的Odata-Model。
这会使所有缓存的条目无效,并强制对绑定进行新的读取:
https://sapui5.hana.ondemand.com/#/api/sap.ui.model.odata.v2.ODataModel%23methods/invalidate