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

时间:2017-10-26 12:40:47

标签: odata sapui5

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

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

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

2 个答案:

答案 0 :(得分:2)

通过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会在output string中添加字符"l",并与 OData规范对齐"999""999l"
  • 确保所有密钥都根据URI标准进行编码(在内部使用encodeURIComponent api 例如: ProductID='sp ace'ProductID='sp%20ace'
  • 无论哪个后端系统为元数据提供服务,它都会以正确的顺序输出键值 s 。给定相同的元数据定义,一个系统可能使用与其他顺序不同的顺序的密钥来服务元数据。在这种情况下,如果只是手动连接密钥,那么当应用程序被传输到服务于不同密钥订单的系统时,应用程序会失败,从而导致模糊错误。

注意

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

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

答案 1 :(得分:1)

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

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

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