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

IT技术 javascript odata sapui5
2021-03-08 21:51:13

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

oModel.update("/Products(999)", data, {/*...*/});

我将选定的索引存储在变量 ( myVar1) 中,我需要将该变量传递给路径字符串。问题是Products(999)- 这是使用硬编码行,但如何999用变量替换

2个回答

通过V2 ODataModel 中APIcreateKey动态创建路径

const path = myODataV2Model.createKey("/Products", {
  // Key(s) and value(s) of that entity set
  "ProductID": myVar1, // with the value 999 for example
  "AnotherKeyProperty": "...",
});
myODataV2Model.update(path/*, ...*/);

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

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

笔记

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

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

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

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

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