在 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;
},
Run Code Online (Sandbox Code Playgroud)
单独测试时,OData 工作正常。/TestSet返回一组测试实体并/TestSet('01')返回其中一个实体。
我已经测试了绑定到/Name、/TestSet('01')/Name等。似乎没有任何效果。
根据开发者指南...
对后端的请求由 ODataModel 提供的列表绑定、元素绑定和 CRUD 函数触发。属性绑定不会触发请求。
因此,不要尝试使用绝对路径直接将数据绑定到目标控件的属性上,而是在父控件或目标控件本身上利用ContextBinding(也称为“元素绑定” ),然后将数据绑定到目标控件,甚至具有相对路径(>而不是>/在路径中)的子控件。
我们可以在 JS 中(例如,如果需要实体键)或在 XML 视图中绑定单个实体。
不要对实体类型的关键谓词进行硬编码,而是确保在加载后通过动态创建与键一起的绑定路径。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)
注意:bindElement和bindObject是相同的 API,只是名称不同。另请参阅GitHub 问题#3000。
在 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>)}"也是可能的,但是同样需要对密钥进行硬编码。