【问题标题】:Data binding with xsodata on SAP UI5SAPUI5 中与 xsodata 的数据绑定
【发布时间】:2017-02-24 17:42:44
【问题描述】:

我有一个在 SAP HANA 上运行的后端,它使用 xsodata 服务与前端通信(使用 SAP UI5 编码)。 xsodata服务输出数据格式如下:

{
  "d": {
    "results": [
      {
        "__metadata": {
          "type": "music.Music_infoType",
          "uri": "***/odata/music.xsodata/Music_info('10020')"
        },
        "ID": "10020",
        "TITLE": "Music 1"
      },
      {
        "__metadata": {
          "type": "music.Music_infoType",
          "uri": "***/odata/music.xsodata/Music_info('10026')"
      },
    "ID": "10026",
    "TITLE": "Music 2"
  }
}

在我的manifest.json 文件中,我将此信息加载到模型中:

"sap.app": {
  ...
  "dataSources": {
    "topmusics": {
        "uri": "/path/to/odata/music.xsodata/Music_info",
        "type": "JSON"
    }
  }
},
"sap.ui5": {
  ...
  "models": {
   "topmusics": {
        "dataSource": "topmusics"
    }
  }
}

在 XML 视图中,我尝试传递一个参数来过滤前 5 首音乐并将数据加载到列表中。但是,由于数据不是从文件的“根”开始,而是从“d/results”开始(参见 json sn-p),我还必须传递此信息,这导致我得到以下代码:

<List headerText="Top 5 Musics" 
  items="{
    path : 'topmusics>/d/results',
    parameters : {  
        $top : '5'
    }}"
  class="sapUiResponsiveMargin">
  <CustomListItem type="Navigation" press="onClick">
      <Link text="{topmusics>TITLE}"
            press="onClick" />
  </CustomListItem>
</List>

但是,通过这段代码,我得到了完整的音乐列表,而不仅仅是前 5 名,这让我相信,因为我必须传递“/d/results”,所以 xsodata 参数 ("$top : '5'") 会被忽略。有什么办法可以做到吗?

在侧节点上,我没有在manifest.json 文件上设置"$top : '5'" 参数,因为我还希望能够将同一模型与其他xsodata 参数一起使用。

编辑:控制器代码:

onClick: function(oEvent) {
    var oItem = oEvent.getSource();
    var oRouter = sap.ui.core.UIComponent.getRouterFor(this);
    oRouter.navTo("musicDetails", {
        musicPath: oItem.getBindingContext("topmusics").getPath().substr(11)
    });
}

【问题讨论】:

    标签: json data-binding odata sapui5


    【解决方案1】:

    绑定参数中的 $top 参数似乎被 UI5 忽略了。此外,文档没有指定此类参数的存在。但是,似乎有一个未记录的属性“length”可以在绑定字符串中提供。

    { path : '/Collection', 长度: 5 }

    此外,由于您使用的是 OData 服务,因此最好使用 OData 模型而不是 JSON 模型。服务 URL 应为 .xsodata 路径,不包括 EntitySet(/Music_info)。

    所以你的清单应该是这样的:

    "topmusics": {
        "uri": "/path/to/odata/music.xsodata",
        "type": "OData"
    }
    

    你的 XML 会这样设置

    <List headerText="Top 5 Musics" 
      items="{
      path : 'topmusics>/Music_info',
      length : 5
      }"
     class="sapUiResponsiveMargin">
     <CustomListItem type="Navigation" press="onClick">
         <Link text="{topmusics>TITLE}"
               press="onClick" />
     </CustomListItem>
    </List>
    

    【讨论】:

    • 我正在尝试使用这个:openui5.hana.ondemand.com/#docs/guide/… 以这种方式设置绑定,我可以设置 odata 参数,就像我在代码中所做的那样
    • 这是 OData 模型 V4 语法,可能不适用于您必须使用的较低 OData V2 模型。
    • 我明白了,虽然我觉得奇怪的是这些参数在 URL 中传递时起作用。无论如何,我应用了您的建议,但是由于我在单击列表的元素时正在执行导航到另一个页面,因此在将模型更改为 OData 时出现错误“无法读取未定义的属性 'indexOf'”。我想知道是否有 $orderby、$expand 或 $filter 等参数的选项,或者是否在 URL 中使用它们是唯一的方法。
    • $filter 和 $orderby 参数是在您按照定义添加填充器和排序器时自动创建的 here
    • 非常感谢,这正是我想要的。我将控制器的代码添加到帖子中。当我将模型的类型更改为 OData 时,在尝试获取导航到详细信息页面的路径时,出现“未捕获的类型错误:无法读取未定义的属性 'indexOf'”错误。你有什么建议可能是错的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多