如何在UI5中动态创建实体路径?

问题描述 投票:1回答:2

我想更新一个填充OData svc的表。我正在使用这种方法:

oModel.update("/Products(999)", oData, {
  success: mySuccessHandler,
  error: myErrorHandler
});

我在变量中选择了索引,我需要传递该变量。问题是Products(999) - 这是使用硬编码行但如何用变量替换?

odata sapui5
2个回答
3
投票

通过ODataModel中的API createKey动态创建路径:

const path = myODataModel.createKey("/Products", {
  ProductID: 999, // your dynamic key value
  AnotherKeyProperty: "...",
});
myODataModel.update(path /*,...*/);

与手动连接路径的字符串相比,createKey具有以下优点:

  • 它始终以对应于给定属性的EDM type的正确格式输出键值(在内部使用ODataUtils.formatValue)。例如:如果ProductID的类型为Edm.Int64,则UI5在"l"中附加字符output string,与OData规范对齐:"999""999l"
  • 它确保所有密钥都根据URI标准进行编码(在内部使用encodeURIComponentapi)。例如:ProductID='sp ace'ProductID='sp%20ace'
  • 无论哪个后端系统为元数据提供服务,它始终以正确的顺序输出键值。给定相同的元数据定义,一个系统可能使用与其他顺序不同的顺序的密钥来服务元数据。在这种情况下,如果只是手动连接密钥,那么当应用程序被传送到服务于不同密钥订单的系统时,应用程序会失败,从而导致模糊错误。

注意

由于createKey依赖于服务元数据中的信息,因此应在加载$metadata之后执行API。为此,可以使用promise based API metadataLoaded

myODataModel.metadataLoaded().then(/*createKey*/);

1
投票

使用javascript连接运算符+将变量的值合并到url字符串中:

var sIndex = "123";
oModel.update("/Products(" + sIndex + ")", oData, {success: mySuccessHandler, error: myErrorHandler});

顺便说一句:数字类型自动转换为字符串。

© www.soinside.com 2019 - 2024. All rights reserved.