OData树与片段中的筛选器绑定

OData树与片段中的筛选器绑定,odata,sapui5,sap-fiori,Odata,Sapui5,Sap Fiori,在启动SAPUI5应用程序时,我使用oModel.read(),从ODataV2服务读取数据。数据从后端正确加载到ODataModel中。稍后我想在片段中使用我的一个实体(值帮助) 因为显示片段中数据的控件是sap.m.Tree控件。我不能使用本地JSONModel将数据绑定到片段,但必须坚持使用ODataModel 如何进行绑定以使数据显示在我的片段中 这是oModel.read: oModel.read(“/CategoriesSet”{ 过滤器:过滤器, 成功:功能(oResult){ /

在启动SAPUI5应用程序时,我使用
oModel.read()
,从ODataV2服务读取数据。数据从后端正确加载到ODataModel中。稍后我想在片段中使用我的一个实体(值帮助)

因为显示片段中数据的控件是
sap.m.Tree
控件。我不能使用本地JSONModel将数据绑定到片段,但必须坚持使用ODataModel

如何进行绑定以使数据显示在我的片段中

这是oModel.read:

oModel.read(“/CategoriesSet”{
过滤器:过滤器,
成功:功能(oResult){
// ...
},
});
在值帮助中,该片段被称为:

onCatValueHelp:函数(oEvent){
如果(!这个){
this._oDialog=sap.ui.xmlfragment(“.view.Categories”,this);
this.getView().addDependent(this.\u oDialog);
}
这个;
},
这是片段:



如果我对路径使用
'/categorieset'
,那么我会将数据加载到片段中,但随后会再次从后端提取数据,但不使用过滤器。由于后端调用的性能不是很好,我宁愿使用上一个
oModel.read()

模型中已经存在的数据。如果您想在开始时执行读取,可以将成功回调的结果存储在JSONModel中,然后将此模型绑定到片段

或者,您可以跳过第一个调用,并在片段中仔细配置该调用以满足您的需要

实际上,这正是odata模型的工作原理

就我个人而言,我更喜欢第一个选项,因为javascript中的过滤比声明式方法更容易。

如中所示,您可以用XML初步定义静态过滤器

但是,如果需要动态确定过滤器值,则必须在JS中创建过滤器实例并将其传递给树绑定。您可以将绑定定义保留为XML格式,但聚合绑定应该先挂起:true(以避免不必要地发送多个请求)


//一旦可以从JS访问该树:
const suspendedTreeBinding=myTree.getBinding(“项”);
悬挂式伸缩过滤器(过滤器,“应用”);
suspendedTreeBinding.resume();//开始发送单个数据请求,但使用筛选器
无需事先调用
oModel.read()



脱离主题,但尽可能避免使用旧的factory函数
sap.ui.xmlfragment
,因为它自UI5 v1.58以来就被弃用了!改用。例如……

哇!OData V2绑定是否也可以使用挂起/恢复方法?@Cmdd Yes./是sap/ui/model/Binding中的所有公共方法(因此适用于所有类型的绑定,甚至OData V2绑定)。绑定定义(如XML)中的属性
suspended:true
可用于所有ManagedObject/Controls。例如,ODataListBinding仅在调用
后发送GET请求。resume()
@Cmdd也适用于OData V4:我想我误解了文档,从未对它们进行过适当的尝试。我以为它只适用于OData V4:-)@BoghyonHoffmann:谢谢你的回复和离题的评论。我很感激,只是调整了片段。现在我尝试使用suspended:true属性。但不幸的是,它还不起作用。第一次加载片段时,将立即调用后端。在我的oDataService或默认oDataModel中还有什么需要调整的吗?谢谢您的回复。我认为我不能使用JSONModel,因为数据用于sap.m.tree控件中,要获得正确的树,使用oDataModel似乎更容易。如果我想为树使用JSON模型,那么它必须是嵌套的JSON,但似乎很难将sucess回调的结果转换为该模型。问题更为严重,因为您希望避免检索所有
分类集
实体。但是使用
operationMode:'Client'
,首先获取所有实体,然后在客户端上应用过滤器,即使过滤器是在树绑定构造函数中定义的。根据文档:>如果使用
OperationMode.Client
,则请求不带过滤器的完整集合;筛选器应用于客户端。您的后端是否支持>预筛选树和[…]响应完整的树层次结构,包括所有内部节点?然后,您可以将
useServersideApplicationFilters:true
添加到
参数中(但不包括
操作模式:'Client'
!),以避免获取所有实体。只有这样,
$filter
查询才会添加到请求URL和API引用中。(个人观点…)我会重新考虑是否绝对需要在树中显示类别。对于前端和后端开发人员来说,它可能很快变得过于复杂,无法实现需求。