将属性绑定到单个 OData 实体

Tia*_*ida 2 odata sapui5

在 UI5 中,如果您的模型是 OData,是否可以将单个实体的单个属性绑定到控件属性?如果将聚合绑定到实体集,则绑定工作正常,但似乎不适用于实体的属性。假设我有一个名为 的实体集TestSet。每个“测试”都有属性KeyName。我想将表的标题绑定到Name该集合上的一个实体的标题。

下面的代码有什么问题?

createContent: function(oController) {
    jQuery.sap.require("sap.ui.table.Table");
    var oTable = new sap.ui.table.Table({title: "{/TestSet('01')/Name}"});
    oTable.setModel(new sap.ui.model.odata.ODataModel("/path/to/root/of/odata/"));
    oTable.bindProperty("title", "/TestSet('01')/Name");
    return oTable;
},
Run Code Online (Sandbox Code Playgroud)

单独测试时,OData 工作正常。/TestSet返回一组测试实体并/TestSet('01')返回其中一个实体。

我已经测试了绑定到/Name/TestSet('01')/Name等。似乎没有任何效果。

Bog*_*ann 5

根据开发者指南...

对后端的请求由 ODataModel 提供的列表绑定、元素绑定和 CRUD 函数触发。属性绑定不会触发请求

因此,不要尝试使用绝对路径直接将数据绑定到目标控件的属性上,而是在父控件或目标控件本身上利用ContextBinding(也称为“元素绑定” ),然后将数据绑定到目标控件,甚至具有相对路径(>而不是>/在路径中)的子控件。

我们可以在 JS 中(例如,如果需要实体键)​​或在 XML 视图中绑定单个实体。

在JS中

不要对实体类型的关键谓词进行硬编码,而是确保在加载后通过动态创建与键一起的绑定路径。v2.ODataModel.createKey()$metadata

const oTable = new Table({ // Required from "sap/ui/table/Table"
  title: "{Name}", // No absolute but relative binding path (no '/')
});
const myODataModel = /*...*/;
await myODataModel.metadataLoaded();
const bindingPath = myODataModel.createKey("/TestSet", { // See stackoverflow/a/47016070
  key1: "...",
  key2: 1234,
}); // Returns e.g. "/TestSet(key1='test1',key2='1234l')"
oTable.bindElement({ // Triggers a request and resolves the relative {Name} property.
  path: bindingPath,
  parameters: {
    expand: "...",
    select: "...",
    // ... for more options see sap/ui/model/odata/v2/ODataContextBinding
  },
  events: { // Event handlers can be also assigned
    dataRequested: e => { /*...*/ },
    dataReceived: e => { /*...*/ },
    change: e => { /*...*/ },
  },
});
Run Code Online (Sandbox Code Playgroud)

注意:bindElementbindObject是相同的 API,只是名称不同。另请参阅GitHub 问题#3000

在 XML 视图中

在 XML 视图中,单个对象/实体可以通过任何控件进行绑定binding。但是动态创建密钥(createKey如上所示)是不可能的。因此,binding仅与名称结合使用<NavigationProperty>,其中不需要定义键。

<table:Table xmlns:table="sap.ui.table"
  binding="{
    path: 'ToThatSingleEntity',
    parameters: {
      expand: '...',
      select: '...'
    },
    events: {
      dataRequested: '.onDataRequested',
      dataReceived: '.onDataReceived',
      change: '.onDataFromModelChanged'
    }
  }"
  title="{FromThatSingleEntity}">
Run Code Online (Sandbox Code Playgroud)

binding="{/TestSet(<keys>)}"也是可能的,但是同样需要对密钥进行硬编码。