You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:20:21