如何利用导航属性?

时间:2018-09-24 16:21:54

标签: odata sapui5

OData服务(V2)包含以下多个导航属性:

ClassNum: "ZPM_TEST_01"
ClassNumDescr: "ZPM_TEST_01"
ClassType: "001"
InternalClass: "0000000130"
ValidFrom: Tue Sep 04 2018 02:00:00 GMT+0200 (Central European Summer Time) {}
ValidUntil: Fri Dec 31 9999 01:00:00 GMT+0100 (Central European Standard Time) {}
to_IClassHeaderVh: {__deferred: {…}}
to_IClassVh: {__deferred: {…}}

如上所述,to_IClassHeaderVhto_IClassVh是导航属性。
请求OData服务的代码:

oModel.read(sUri, {
  success: function (oData) {
  },
  error: Util.showErrorClassNotFound
});

如何通过代码从导航属性中获取URL?我可以通过以下对象获取它:

oData.to_IClassVh.__deferred.uri 

但是我不知道这是否是正确的方法。

1 个答案:

答案 0 :(得分:1)

导航属性,顾名思义,是可以用来导航到相关实体类型(spec)的属性。 UI5框架也支持此功能,因此应用程序开发人员不必手动提取URL。实际上,您甚至不需要调用read。让我们以这个EDM [1] 为例:

客户
导航:“订单”
1 ___ n 订购
导航:“客户”

...来自此Northwind service (metadata)

one entity to a collection导航:

<Page binding="{/Customers('ALFKI')}">
  <List items="{Orders}">
    <StandardListItem title="{OrderID}" />
  </List>
</Page>

one entity to another single entity导航:

<Page binding="{/Orders(10643)}">
  <Panel binding="{Customer}" headerText="{ContactName}" />
</Page>

以下是使用导航属性的示例:https://embed.plnkr.co/F3t6gI8TPUZwCOnA

在您的情况下,您可以使用to_IClassHeaderVhto_IClassVh代替CustomerOrders。 UI5随后将为您发送请求。请记住,只有上下文绑定和聚合绑定才能处理发送请求。绑定属性

如果您想知道XML中的binding属性;这只是bind a single entity (context)的方式之一。如果通常需要动态指定实体键(ID),则必须在JS中使用API​​ bindElement [API] 。仅出于示例目的,我在这里对键进行硬编码。

此外,您还可以添加binding parameter expand,以等待导航属性名称。

<Page binding="{
  path: '/Orders(10643)',
  parameters: {
    expand: 'Customer'
  }
}" >
  <!-- ... -->
</Page>

响应: https://services.odata.org/V2/Northwind/Northwind.svc/Orders(10643)?$expand=Customer&$format=json

以下是使用expand的示例:https://embed.plnkr.co/wAlrHB


[1]:“实体数据模型”-特定于OData的E / R模型