我正在尝试绑定sap.m.Table中的项目(阻止使用Factory函数),我收到此错误:
缺少Element
的聚合项的模板或工厂函数
我的观点如下:
<Table id="favTable">
<headerToolbar>
<Toolbar>
<Title id="tableHeader" text="{i18n>tableHeader}"/>
</Toolbar>
</headerToolbar>
<columns>
<Column>
<Label text="{i18n>serviceNameColText}" />
</Column>
<Column>
<Label text="{i18n>serviceTechNameColText}"/>
</Column>
<Column width="50px"/>
</columns>
<ColumnListItem>
<Text text="{Text}" />
<Text text="{Service}" />
<Button icon="sap-icon://delete" press="onDeleteRow" />
</ColumnListItem>
</Table>
根据控制器代码(使用绑定的OData服务)尝试在路径被命中后将项目绑定到视图中:
_onPatternMatched: function(oEvent) {
let oTable = this.getView().byId(sIdTable);
// bind items dynamically with attributes
const sGroupId = oEvent.getParameter("arguments").Group;
let sBindingPath = "/DataSet(SetId='" + sSetId + "')"
oTable.bindItems({
path: sBindingPath,
parameters: {
navigation: {
FavoriteGroupSet: "ToFavorites"
}
},
filters: [
// new Filter("InstitutionId", "EQ", oEvent.getParameter("arguments").Institution),
new Filter("SetId", "EQ", sSetId)
]
})
},
我需要做些什么才能使正确的绑定显示正确的数据?
答案 0 :(得分:6)
在UI5的聚合绑定概念中,您可以使用两种机制来构建聚合项:
我认为您希望使用XML中的ColumnListItem
作为模板。问题是,在构建XML视图时,只有当您还在XML中绑定父聚合时,控件才会用作父聚合的模板。否则,他们被解释为简单的孩子。
简而言之,UI5将您的视图解释为具有单个静态项目的sap.m.Table
。当您稍后尝试绑定items
聚合时,它会销毁此项(实际上它只会在您的情况下引发错误,因为您在使用bindAggregation时必须指定模板或工厂方法(bindItems
只是此方法的包装器。)
解决此问题的一个选项是使用相对绑定,然后使用bindElement方法来更改Table的绑定。在你的情况下,你不清楚你想要做什么,因为sBindingPath
似乎有一个像/DataSet(SetId='ABC')
这样的值,它实际上不会指向集合,而是指向单个DataSet实体。
如果您实际更改了OData服务的使用方式并且有导航(例如路径看起来像/DataSet('ABC')/MyNavigationSet
),那么您可以执行以下操作:
查看:
<!-- note that the items binding path should not start with / (to be relative) -->
<Table id="favTable" items={MyNavigationSet}>
<columns>
<!-- your columns... -->
</columns>
<items>
<ColumnListItem id="favTableItemTemplate">
<cells>
<Text text="{Text}" />
<Text text="{Service}" />
<Button icon="sap-icon://delete" press="onDeleteRow" />
</cells>
</ColumnListItem>
</items>
</Table>
控制器:
function(oEvent) {
// the rest of your code
this.byId("favTable").bindElement(sBindingPath);
}
与您当前的OData服务一起使用的另一个选项是将模板声明为依赖项,然后将其用于绑定。应设置templateShareable
标志,以便在重新绑定聚合时不破坏模板。
查看:
<Table id="favTable">
<columns>
<!-- your columns... -->
</columns>
<dependents>
<ColumnListItem id="favTableItemTemplate">
<cells>
<Text text="{Text}" />
<Text text="{Service}" />
<Button icon="sap-icon://delete" press="onDeleteRow" />
</cells>
</ColumnListItem>
</dependents>
</Table>
控制器:
function(oEvent) {
// the rest of your code
this.byId("favTable").bindItems({
path: sBindingPath,
template: this.byId("favTableItemTemplate"),
templateShareable: true,
parameters: {
navigation: {FavoriteGroupSet: "ToFavorites"}
},
filters: [new Filter("SetId", "EQ", sSetId)]
})
}