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

Tri*_*wip 2 odata sapui5

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

oModel.update("/Products(999)", oData, {
  success: mySuccessHandler,
  error: myErrorHandler
});
Run Code Online (Sandbox Code Playgroud)

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

Bog*_*ann 7

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

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

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

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

笔记

由于createKey依赖于来自服务元数据的信息,因此应在$metadata加载后执行 API 。为此,可以使用基于承诺的 APImetadataLoaded

myODataModel.metadataLoaded().then(/*createKey*/);
Run Code Online (Sandbox Code Playgroud)