ui5 问题 table 绑定在 1.71 下随机工作

ui5 issue table binding working randomly under 1.71

在 v1.71 下,我的代码随机工作(乱七八糟,有时 table 正确显示项目,有时却不正确),尽管它在 v1.6+ 下完美运行。

我在 1.17.21

下工作

我的默认模型是双向绑定。

table 是在 xml 视图中创建的:

<Table id="tableId" items="{Items}" delete=".onDeleteRow" mode="Delete" noDataText="{i18n>noItems}">
                        <headerToolbar>
                            <OverflowToolbar>
                                <Title text="{i18n>addedItems}" level="H3"/>
                                <ToolbarSpacer></ToolbarSpacer>
                                <Button icon="sap-icon://add" press=".onAddItemPress" tooltip="{i18n>addButtonTooltip}"/>
                            </OverflowToolbar>
                        </headerToolbar>
                        <columns>
                            <Column hAlign="Center" minScreenWidth="Small" demandPopin="true" popinDisplay="Inline">
                                <header>
                                    <Label text="{/#PRItem/ShortText/@sap:label}"/>
                                </header>
                            </Column>
                            <Column hAlign="Center" minScreenWidth="Small" demandPopin="true" popinDisplay="Inline">
                                <header>
                                    <Label text="{/#PRItem/Quantity/@sap:label}"/>
                                </header>
                            </Column>
                            <Column hAlign="Center" minScreenWidth="Small" demandPopin="true" popinDisplay="Inline">
                                <header>
                                    <Label text="{/#PRItem/PriceUnit/@sap:label}"/>
                                </header>
                            </Column>
                            <Column hAlign="Center" minScreenWidth="Small" demandPopin="true" popinDisplay="Inline">
                                <header>
                                    <Label text="{/#PRItem/Price/@sap:label}"/>
                                </header>
                            </Column>
                            <Column id="editIconColumn" hAlign="End" width="50px"/>
                        </columns>
                        <items>
                            <ColumnListItem>
                                <cells>
                                    <Text text="{ShortText}"/>
                                    <Text text="{Quantity}"/>
                                    <Text text="{Quantity}"/>
                                    <Text text="{parts [path:'Price', path:'Quantity', path:'PriceUnit'], formatter: this.formatter.setSousTotal}"/>
                                    <core:Icon src="sap-icon://edit-outside" press=".onEditIconPress" tooltip="{i18n>editIconTooltip}"/>
                                </cells>
                            </ColumnListItem>
                        </items>
                    </Table>

然后我按如下方式绑定视图上下文和项目:

_createPurchaseRequest: function () {
        var oContext = this.getOwnerComponent().getModel().createEntry("/PRHeaderSet");

        this.getView().setBindingContext(oContext);
        this._getDefaultValues();
},

onAddItemPress: function (oEvent) {
        var oView = this.getView(),
            // oModel = this.getOwnerComponent().getModel(),
            oModel = this.getModel(),
            oHdrCtx = oView.getElementBinding() ? oView.getElementBinding().getBoundContext() : oView.getBindingContext(),
            oItemContext = oModel.createEntry("/PRItemSet"),
            aAllItems = this._getArrayOrDefault(oModel.getProperty(oHdrCtx.getPath() + "/Items"));

        aAllItems.push(oItemContext.getPath().substring(1));
        oModel.setProperty("Items", aAllItems, oHdrCtx);
        this.getOwnerComponent().getModel("createViewModel").setProperty("/mode", "creationMode");
        oModel.setProperty("Quantity", "7", oItemContext);
     },

    _getArrayOrDefault: function (e) {
        return e ? Array.from(e) : [];
    },

聚合(“items”)已正确绑定,但有时其属性 aKeys 和 aAllKeys 为空,因此 table 不显示任何内容。

工作时:

不工作(尝试添加一个或多个项目后)

工作案例(左)和非工作案例(右)之间的比较:

谁能看到这个问题?

如果我理解你的代码正确,如documented

Do not modify objects or values inside the model manually; always use the provided API to change data in the model, or use two-way binding (see Two-way Binding section below).

你正在做的事情不受官方支持。仅使用 API 方法。

在您的 onAddItemPress 函数中,不要像那样将项目添加到 table,因为 UI5 不喜欢它。相反,您必须使用 OData Create(请参阅文档)在后端创建条目,然后它将自动触发对 table 上实体集绑定的更新并使其出现。

根据您的需要,有几种不同的方法可以做到这一点。总之,您可以采用两种不同的方式来创建 OData 以立即在后端创建条目。或者,您可以使用 createEntry 在您的 OData 模型中创建一个本地实体,然后您可以通过绑定到弹出表单或代码或其他方式填充数据,然后使用 submitChanges 函数将其发送给您的 OData 提供者并创建条目。第二种方式的优点是你也可以在你的应用程序中有一个“重置”按钮,用户可以在更改发送到服务器之前放弃更改。当然,第一个选项也可以,但它会涉及为您创建的对象发送删除请求。

好吧,我不太明白,但我设法通过给框架更多时间来进行两个独立操作来解决我的问题,这两个操作将上下文设置为视图并获取默认值。我在这里指的是独立人士,因为我不需要这些默认值来设置上下文,我可以在不设置前者的情况下获得这些值。