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

问题描述 投票:0回答:3

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

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

我将选定的索引存储在变量中(

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

javascript odata sapui5
3个回答
11
投票

通过 V2 ODataModel 的 API

createKey
动态创建路径:

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/*, ...*/); // applies also to .remove

与手动连接路径字符串相比,

createKey
具有以下优点:

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

注意

由于

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

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

0
投票

使用 javascript 连接运算符

+
将变量的值合并到 url 字符串中:

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

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


0
投票

使用反引号“``”内的新 JavaScript 模板字符串语法,它看起来像这样:

var sIndex = "123";
oModel.update(`/Products(${sIndex})`, oData, {success: mySuccessHandler, error: myErrorHandler});
© www.soinside.com 2019 - 2024. All rights reserved.