在SAP UI5上与xsodata进行数据绑定

时间:2017-02-24 17:42:45

标签: json data-binding odata sapui5

我有一个在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片段),我还必须传递这些信息,这使我得到以下代码: / 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/resultsxsodata参数({{1 }}被忽略。我有什么方法可以做到这一点吗?

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

编辑:控制器的代码:

xsodata

1 个答案:

答案 0 :(得分:1)

UI5似乎忽略了绑定参数中的$ top参数。此外,文档没有指定这种参数的存在性。然而,似乎有一个无证件的属性长度&#39;可以在绑定字符串中提供。

  

{路径:&#39; / Collection&#39;,length:5}

此外,由于您使用的是OData服务,因此使用OData模型而不是JSON模型是理想的选择。服务URL应该是除了EntitySet(/ Music_info)之外的.xsodata路径。

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

"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>