sap.ui.model.odata.v2.ODataModel#refresh
API 的奇怪问题,导致我的 UI 无法正确更新。
我正在使用多选表,通过它我允许两种不同类型的更新,并且我已经实现了相同的更新
// Base Controller
getModel(name, global = false) {
const scope = global ? this.getOwnerComponent() : this.getView();
return scope.getModel(name);
},
updateEntry(model, path, data, options) {
return new Promise((resolve, reject) => {
const parameters = {
...options,
success: (data, response) => {
resolve({ data, response });
},
error: error => {
reject(error);
},
};
model.update(path, data, parameters);
});
},
// Table Controller, Update Handler for both scenarios, Model "main" is bound via List Binding to my Table
onUpdate: async function (oEvent) {
const bContinue = await SubmitDialog.init.call(this);
if (!bContinue) return;
const srv = this.getModel("main", true);
// ... Fetching Table Data / some additional logic
const aUpdates = [];
aAssets.forEach(asset => {
// ... Updating fields setting uri etc.
aUpdates.push(this.updateEntry(srv, `/EntitySet${uri}`, body, { groupId: "update", refreshAfterChange: false }));
});
await Promise.all(aUpdates);
srv.refresh(true);
},
最后在同一个控制器中
onAfterRendering: function () {
this.byId("table").getBinding("items").attachDataReceived(() => {
console.log("Model after update", this.getModel("main").getProperty("/"));
this._initUIData(); // some UI changes
});
},
更新处理程序的功能完全符合我的预期。我首先对所有更新执行 $batch 请求,然后执行 $batch GET 请求以获取更新的数据,然后相应地修改我的 UI(即在图标选项卡栏中显示计数器等)
但是,对于其中一种场景,我可以看到,虽然 GET 请求后收到的有效负载反映了我的更改,但模型根本没有更新,因此我更新 UI 的逻辑失败。我假设它与我的
dataReceived
事件处理程序有某种关系,但老实说我不确定为什么。 FWIW 在其中一个更新处理程序(正常工作的处理程序)中,我在 srv.refresh(true)
之后关闭一个对话框,但这是唯一不同的地方。
还值得一提的是,我对 OData 模型使用
Client
操作模式。
任何提示或想法都非常感谢。
我相信我可能已经找到了解决方案。我的第二个更新方案(尚未更新模型的方案)是更新,这会导致列表条目不再出现在我的表中。我相信在这种情况下,即使我将第一个参数 v2.ODataModel#refresh
设置为
bForceUpdate
,也不会满足 true
的以下条件。
这将重新加载模型中存储的所有数据。这将检查更新数据的所有绑定,并如果数据已更改更新控件。
我现在也将第二个参数
bRemoveData
设置为true
,这似乎解决了我的问题。