【发布时间】:2021-02-16 12:32:56
【问题描述】:
我在使用oModel.read() 启动 SAPUI5 应用程序时从 OData V2 服务读取数据。数据已从后端正确加载到 ODataModel。稍后我想在片段中使用我的一个实体(价值帮助)。
作为在片段中显示数据的控件是sap.m.Tree 控件。我不能使用本地 JSONModel 将数据绑定到片段,但必须坚持使用 ODataModel。
如何进行绑定以使数据显示在我的片段中?
这里是oModel.read:
oModel.read("/CategoriesSet", {
filters: aFilters,
success: function(oResult) {
// ...
},
});
在值帮助中,片段被调用:
onCatValueHelp: function(oEvent){
if (!this._oDialog) {
this._oDialog = sap.ui.xmlfragment("<XXXXX>.view.Categories", this);
this.getView().addDependent(this._oDialog);
}
this._oDialog.open();
},
这是片段:
<Tree id="CatTree" mode="MultiSelect"
items="{
path: '?????',
parameters: {
countMode: 'Inline',
operationMode: 'Client',
numberOfExpandedLevels: 0
}
}">
<StandardTreeItem title="{CatName}" tooltip="{CatID}" />
</Tree>
如果我使用'/CategoriesSet' 作为路径,那么我会将数据加载到片段中,但随后会再次从后端获取数据,但没有过滤器。而且由于后端调用的性能不是很好,我宁愿使用之前oModel.read()的模型中已经存在的数据。
【问题讨论】:
-
问题更深,因为您希望避免检索所有
CategoriesSet实体。但是使用operationMode: 'Client',首先获取所有实体,然后过滤器将应用于客户端,即使过滤器是在树绑定构造函数中定义的。根据文档:>如果使用OperationMode.Client,则请求没有过滤器的完整集合;过滤器应用于客户端。 -
您的后端是否支持 > 预过滤树并[...] 响应完整的树层次结构,包括所有内部节点?然后您可以将
useServersideApplicationFilters: true添加到parameters(但没有operationMode: 'Client'!)以避免获取所有实体。只有这样$filter查询才会添加到 API 引用的请求 URL。 -
(个人意见..) 我会重新考虑是否绝对需要在树中显示类别。对于前端和后端开发人员来说,实现该要求很快就会变得过于复杂。