v2.ODataModel.refresh(true) 获取更新数据但不更新模型

问题描述 投票:0回答:1

我遇到了

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
操作模式。

任何提示或想法都非常感谢。

odata sapui5
1个回答
1
投票

我相信我可能已经找到了解决方案。我的第二个更新方案(尚未更新模型的方案)是更新,这会导致列表条目不再出现在我的表中。我相信在这种情况下,即使我将第一个参数 v2.ODataModel#refresh

 设置为 
bForceUpdate,也不会满足
true
 的以下条件。

这将重新加载模型中存储的所有数据。这将检查更新数据的所有绑定,并如果数据已更改更新控件。

我现在也将第二个参数

bRemoveData
设置为
true
,这似乎解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.