根据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><keys></em>)}" 也是可能的,但同样需要对密钥进行硬编码。