bindProperty到单个OData实体

时间:2014-05-30 13:45:08

标签: 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;
},

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

我测试过绑定到/Name/TestSet('01')/Name等等。似乎没什么用。

2 个答案:

答案 0 :(得分:4)

您可以通过将控件绑定到特定元素来实现这样的属性绑定(层次结构,实际上是aggregation-> element->属性)。举个例子,你可以这样做:

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

然后当你这样做时:

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

HTTP调用由OData模型机制完成,值显示在表的title属性中。

Here's a running example,使用Northwind。

答案 1 :(得分:4)

根据developer guide ...

  

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

因此,我们可以在容器控件或目标上利用ContextBinding / "Element Binding",而不是尝试直接在目标控件的属性上绑定数据。控制自身,并在目标控件的属性上绑定数据,甚至在子控件相对>而不是路径中的>/)上进行绑定。

我们可以使用..

绑定单个实体
    JS中的
  • bindElement/ bindObject

    const oTable = new Table({ // required from "sap/ui/table/Table"
      title: "{Name}",
    }).bindElement("/TestSet('01')"); // returns the control instance
    
  • 或者像这样的XMLView中的binding

    <Table
      binding="{/TestSet('01')}"
      title="{Name}"
    > ...
    

    然而,在声明性视图(例如XML)中,目前无法supply the entity path dynamically via .createKey。因此请谨慎使用binding

值得一提的还有binding events,我们可以更好地控制所请求,接收等数据。以下事件适用于所有类型的绑定(不仅仅是元素绑定)

binding="{
  path: '/TestSet(\'01\')',
  events: {
    dataRequested: '.onTableDataRequested',
    dataReceived: '.onTableDataReceived',
    change: '.onTableDataChange'
  }
}"