在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
返回一组Test实体,/TestSet('01')
返回其中一个实体。
我已经测试了与/Name
,/TestSet('01')/Name
等的绑定。似乎没什么用。
您可以通过将控件绑定到特定元素(层次结构,就像是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。
根据developer guide ...
对后端的请求由ODataModel提供的列表绑定,元素绑定和CRUD函数触发。属性绑定不会触发请求。
因此,我们不是试图直接在目标控件的属性上绑定数据,而是在容器控件或目标控件本身上利用ContextBinding / "Element Binding",并将数据绑定到目标控件的属性上,甚至可以进一步孩子相对控制(>
而不是路径中的>/
)。
我们可以使用..绑定单个实体。
bindElement
/ bindObject
:
const oTable = new Table({ // required from "sap/ui/table/Table"
title: "{Name}",
}).bindElement("/TestSet('01')"); // returns the control instance
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'
}
}"