【问题标题】:bindProperty to Single OData EntitybindProperty 到单个 OData 实体
【发布时间】:2014-05-30 13:45:07
【问题描述】:

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

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

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

【问题讨论】:

    标签: odata sapui5


    【解决方案1】:

    您可以通过将控件绑定到特定元素来实现这样的属性绑定(可以说,层次结构是聚合->元素->属性)。因此,以您为例,您可以这样做:

    var oTable = new sap.ui.table.Table({
      title : "{Name}"
    });
    

    然后当你这样做时:

    oTable.bindElement("/Products(0)");
    

    HTTP 调用由 OData 模型机制进行,值出现在表的 title 属性中。

    Here's a running example,使用北风。

    【讨论】:

      【解决方案2】:

      根据developer guide...

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

      因此,与其尝试使用 absolute 路径直接在目标控件的属性上绑定数据,不如在父控件或目标上利用ContextBinding(又名"Element Binding")控件本身,然后将数据绑定到目标控件的属性上,甚至进一步绑定到具有相对路径的子控件上(>,而不是路径中的>/)。

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

      在 JS 中

      不要对实体类型的关键谓词进行硬编码,而是确保在加载$metadata 之后为create the binding path together with key(s) via v2.ODataModel.createKey() dynamically。

      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 @987654325@
        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 @987654326@
        },
        events: { // Event handlers can be also assigned
          dataRequested: e => { /*...*/ },
          dataReceived: e => { /*...*/ },
          change: e => { /*...*/ },
        },
      });

      注意:bindElement 和 bindObject 是相同的 API,只是名称不同。另见GitHub issue#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}">

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-06
        相关资源
        最近更新 更多