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 提供者并创建条目。第二种方式的优点是你也可以在你的应用程序中有一个“重置”按钮,用户可以在更改发送到服务器之前放弃更改。当然,第一个选项也可以,但它会涉及为您创建的对象发送删除请求。
好吧,我不太明白,但我设法通过给框架更多时间来进行两个独立操作来解决我的问题,这两个操作将上下文设置为视图并获取默认值。我在这里指的是独立人士,因为我不需要这些默认值来设置上下文,我可以在不设置前者的情况下获得这些值。
在 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 提供者并创建条目。第二种方式的优点是你也可以在你的应用程序中有一个“重置”按钮,用户可以在更改发送到服务器之前放弃更改。当然,第一个选项也可以,但它会涉及为您创建的对象发送删除请求。
好吧,我不太明白,但我设法通过给框架更多时间来进行两个独立操作来解决我的问题,这两个操作将上下文设置为视图并获取默认值。我在这里指的是独立人士,因为我不需要这些默认值来设置上下文,我可以在不设置前者的情况下获得这些值。