Fiori应用OData嵌套数组无法在视图显示,求正确访问方式
SAP Fiori OData Read数据后视图绑定不显示的问题解决
问题原因分析
你当前的代码存在两个核心问题:
- OData模型的
read方法是主动拉取数据,但不会自动将返回的数据同步到视图的绑定上下文里——你在success回调里拿到了数据,但视图根本没关联到这些数据; - 视图里的绑定路径完全错误,因为
empSalesSet是集合资源,返回的是数组结构,直接用{empSalesSet/category}这种路径无法定位到具体数据。
解决方案步骤
步骤1:处理Read返回的数据,关联到视图
有两种常用方式:
方式一:使用JSON模型存储数据(适合自定义数据展示场景)
修改Controller的read回调,将返回的OData数据存入JSON模型,再绑定到视图或控件:
onInit: function () { var oDataModel = this.getView().getModel(); var oFilter = new Filter("category", FilterOperator.EQ, "empSales"); var that = this; // 保留视图上下文 oDataModel.read("/empSalesSet", { urlParameters: { "$expand": "set1,set2,set3,set4,set5" }, filters: [oFilter], success: function (data) { // OData V2返回的数据结构是data.d.results(数组) var oJsonModel = new JSONModel(data.d.results); // 将JSON模型绑定到视图,命名为"empModel"(方便视图引用) that.getView().setModel(oJsonModel, "empModel"); }, error: function (oError) { MessageBox.error("数据加载失败:" + oError.message); } }); }
方式二:直接使用OData模型的绑定机制(推荐,符合Fiori最佳实践)
不需要手动调用read,而是给控件设置绑定,由OData模型自动处理数据请求:
onInit: function () { var oView = this.getView(); var oDataModel = oView.getModel(); var oFilter = new Filter("category", FilterOperator.EQ, "empSales"); // 给视图设置绑定上下文(如果确定返回单条数据) oView.bindElement({ path: "/empSalesSet", parameters: { "$expand": "set1,set2,set3,set4,set5", "$filter": oFilter }, events: { dataRequested: function() { // 可添加加载中提示逻辑 }, dataReceived: function() { // 可添加加载完成后的处理逻辑 } } }); }
步骤2:视图绑定的正确语法
根据上面的两种方式,分别给出视图绑定代码:
对应方式一(JSON模型):
如果返回多条数据,用List控件绑定数组,嵌套set3数组用子List:
<!-- 引用命名模型"empModel" --> <List items="{empModel>/}"> <items> <StandardListItem title="{empModel>category}" /> <!-- 绑定嵌套的set3数组 --> <List items="{empModel>set3}"> <items> <StandardListItem title="{empModel>属性名}" /> <!-- 替换为set3里的实际属性 --> </items> </List> <!-- 绑定单个嵌套对象set4 --> <Text text="{empModel>set4/属性名}" /> <!-- 替换为set4里的实际属性 --> </items> </List>
如果返回单条数据,直接绑定根路径:
<Text text="{empModel>/0/category}" /> <!-- /0表示数组第一条 --> <Text text="{empModel>/0/set4/属性名}" /> <!-- 绑定set3数组 --> <List items="{empModel>/0/set3}"> <items> <StandardListItem title="{empModel>属性名}" /> </items> </List>
对应方式二(OData模型绑定上下文):
因为已经给视图设置了绑定上下文,直接绑定属性即可,嵌套结构用/访问:
<!-- 主属性 --> <Text text="{category}" /> <!-- 单个嵌套对象set4 --> <Text text="{set4/属性名}" /> <!-- 嵌套数组set3,用List绑定 --> <List items="{set3}"> <items> <StandardListItem title="{属性名}" /> <!-- set3里的实际属性 --> </items> </List>
关键注意点
- OData V2返回的集合数据结构是
d.results,V4则直接是数组,要注意区分; - 如果使用命名模型,绑定路径必须加上
模型名>/前缀; - 嵌套对象用
父对象/子属性路径,嵌套数组直接绑定数组字段,再在子控件里绑定数组元素的属性。
内容的提问来源于stack exchange,提问作者Ria
相关产品推荐
相关产品推荐

