我有一个具有不同列的表(sap.m.table)。一列包含一个链接,当用户单击该链接时,将打开一个弹出窗口片段,并在列表(sap.m.list)中显示一些详细信息。数据来自oData服务。一个实体为表格提供数据,并通过导航属性获取弹出窗口的数据。
对于这种情况,我有一个可行的示例,其中我在控制器中创建了列表模板。但我相信,仅通过控制器中的xml和bindElement也应该可行。我的第二种情况有什么错误?
第一个场景(运行良好):Popover XML:
<Popover
showHeader="false"
contentWidth="320px"
contentHeight="300px"
placement="Bottom"
ariaLabelledBy="master-title">
<Page
id="master"
class="sapUiResponsivePadding--header"
title="Aktionen">
<List
id="AktionList">
</List>
</Page>
</Popover>
调用控制器文件中的Popover(sPath为/ TableEntity('123456')/ AktionSet):
if (!this._oPopover) {
Fragment.load({
id: "popoverNavCon",
name: "bernmobil.ZPM_STOERUNG_FDA.view.AktionPopover",
controller: this
}).then(function(oPopover){
this._oPopover = oPopover;
this.getView().addDependent(this._oPopover);
var oList = Fragment.byId("popoverNavCon", "AktionList");
var oItemTemplate = this._BuildItemTemplate();
oList.bindAggregation("items", sPath, oItemTemplate);
this._oPopover.openBy(oControl);
}.bind(this));
} else {
var oList = Fragment.byId("popoverNavCon", "AktionList");
var oItemTemplate = this._BuildItemTemplate();
oList.bindAggregation("items", sPath, oItemTemplate);
this._oPopover.openBy(oControl);
}
_BuildItemTemplate: function(){
var oItemTemplate = new sap.m.ObjectListItem({
title:"{AktionsBez}",
type: "Inactive"
});
oItemTemplate.addAttribute(new sap.m.ObjectAttribute({
text : "{Aktionstext}"
}));
oItemTemplate.addAttribute(new sap.m.ObjectAttribute({
text : "{path: 'ChangedAt', type: 'sap.ui.model.type.DateTime'}"
}));
return oItemTemplate;
}
这是第二种情况的想法,它调用oDataService但不显示任何数据:ObjectListItem不仅在XML中具有List定义,而且在XML中定义:
<List
id="AktionList"
items="{AktionSet}">
<ObjectListItem
title="{AktionsBez}"
type="Active">
<ObjectAttribute text="{Aktionstext}" />
<ObjectAttribute text="{ChangedAt}" />
</ObjectListItem>
</List>
在控制器中,无需构建模板并执行bindAggretation即可:
var oList = Fragment.byId("popoverNavCon", "AktionList");
oList.bindElement(sPath);
如何获得第二个显示列表中数据的方案?
我建议第三个解决方案:
在表行上按时,使用oContext = oClickedRow.getBindingContext()
或类似方法获取当前行的绑定上下文。此上下文应指向/TableEntity('123456')
。
应用这种情况下你要Popover
使用oPopover.setBindingContext(oContext)
。
现在,你Popover
具有与表行相同的上下文。XML在第二种情况下应该看起来像。
使用路径是imo的额外步骤。我认为绑定完整Popover
而不是唯一的绑定也更有意义List
。具有整洁的副作用,你可以将你的属性TableEntity
用作标题Popover
。它还完全避免直接使用控件(这是七个致命的错误之一),你应该能够删除所有这些ID。
按照您的建议进行操作,它可以很好地工作,我可以摆脱片段中的ID。您能否解释一下为什么当我执行setBindingContext时导航属性起作用,并且列表项指向(AktionSet}。这是由于相对绑定{AktionSet}(不带/),而根是/ TableEntity('123456')绑定上下文?
您能否为我提供更多有关使用ID的致命罪过的信息。我知道它会造成问题,但从来没有将其视为不良做法。
是的,绑定就是这样工作的。如果提供相对路径(没有斜杠),它将检查是否有周围的上下文,并将相对路径附加到该上下文中。
我认为ID不需要在XML和JS之间建立紧密的联系。这样可以减少代码的可重用性。这也使重构更加困难。您的列表成为表格了吗?您还必须将ID重命名为AktionTable。在今年的UI5Con上,我听到了一个有趣的演讲,基本上不需要ID就可以完成所有操作,并且它使您的代码更具可维护性。