bindProperty到单个OData实体

问题描述 投票:2回答:2

在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返回一组Test实体,/TestSet('01')返回其中一个实体。

我已经测试了与/Name/TestSet('01')/Name等的绑定。似乎没什么用。

odata sapui5
2个回答
4
投票

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

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

然后当你这样做:

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

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

Here's a running example,使用Northwind。


4
投票

根据developer guide ...

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

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

我们可以使用..绑定单个实体。

  • JS中的bindElement/ bindObjectconst 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'
  }
}"
© www.soinside.com 2019 - 2024. All rights reserved.