使用 bindElement 填充时,弹出窗口中的 SAPUI5 sap.m.list 为空
SAPUI5 sap.m.list in a popover is emtpy when populated using bindElement
我有一个包含不同列的 table (sap.m.table)。一列包含 link,当用户单击 link 时,弹出窗口片段将打开并在列表中显示一些详细信息 (sap.m.list)。数据来自 oData 服务。一个实体提供 table 并通过导航 属性 获取弹出窗口的数据。
我有一个针对此场景的工作示例,我在控制器中创建了列表模板。但我相信这也应该通过 xml 和控制器中的 bindElement 来实现。我的第二种情况有什么错误?
第一个场景(工作正常):
弹出框 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>
在controller文件中调用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 但不显示任何数据:
XML 中不仅有 List 定义,还在 XML:
中定义了 ObjectListItem
<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);
如何获取列表中显示数据的第二个场景?
视图的相关部分应如下所示:
<List
id="AktionList"
items="{AktionSet}">
<dependents>
<ObjectListItem
id="oObjectListItem"
title="{AktionsBez}"
type="Active">
<ObjectAttribute text="{Aktionstext}" />
<ObjectAttribute text="{ChangedAt}" />
</ObjectListItem>
</dependents>
</List>
在控制器中:
var oList = sap.ui.core.Fragment.byId(this.getView().createId("popoverNavCon"), "AktionList");
oList.bindItems({
path: sPath,
template: sap.ui.core.Fragment.byId(this.getView().createId("popoverNavCon"), "oObjectListItem")
});
查看 sap.m.List
aggregation 部分中的 dependents
了解详细信息。
我建议第三种解决方案:
按下 table 行时,使用 oContext = oClickedRow.getBindingContext()
或类似的东西获取当前行的绑定上下文。此上下文应指向 /TableEntity('123456')
.
使用 oPopover.setBindingContext(oContext)
将此上下文应用于您的 Popover
。
现在您的 Popover
与您的 table 行具有相同的上下文。 XML 应该类似于您的第二种情况。
在我看来,使用路径是一个额外的步骤。我认为绑定完整的 Popover
而不仅仅是 List
也更有意义。具有整洁的副作用,您可以使用 TableEntity
的 属性 作为 Popover
的标题。它还完全避免了直接使用控件(这是七大罪之一),您应该能够删除所有这些 ID。
我有一个包含不同列的 table (sap.m.table)。一列包含 link,当用户单击 link 时,弹出窗口片段将打开并在列表中显示一些详细信息 (sap.m.list)。数据来自 oData 服务。一个实体提供 table 并通过导航 属性 获取弹出窗口的数据。
我有一个针对此场景的工作示例,我在控制器中创建了列表模板。但我相信这也应该通过 xml 和控制器中的 bindElement 来实现。我的第二种情况有什么错误?
第一个场景(工作正常): 弹出框 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>
在controller文件中调用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 但不显示任何数据: XML 中不仅有 List 定义,还在 XML:
中定义了 ObjectListItem<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);
如何获取列表中显示数据的第二个场景?
视图的相关部分应如下所示:
<List
id="AktionList"
items="{AktionSet}">
<dependents>
<ObjectListItem
id="oObjectListItem"
title="{AktionsBez}"
type="Active">
<ObjectAttribute text="{Aktionstext}" />
<ObjectAttribute text="{ChangedAt}" />
</ObjectListItem>
</dependents>
</List>
在控制器中:
var oList = sap.ui.core.Fragment.byId(this.getView().createId("popoverNavCon"), "AktionList");
oList.bindItems({
path: sPath,
template: sap.ui.core.Fragment.byId(this.getView().createId("popoverNavCon"), "oObjectListItem")
});
查看 sap.m.List
aggregation 部分中的 dependents
了解详细信息。
我建议第三种解决方案:
按下 table 行时,使用 oContext = oClickedRow.getBindingContext()
或类似的东西获取当前行的绑定上下文。此上下文应指向 /TableEntity('123456')
.
使用 oPopover.setBindingContext(oContext)
将此上下文应用于您的 Popover
。
现在您的 Popover
与您的 table 行具有相同的上下文。 XML 应该类似于您的第二种情况。
在我看来,使用路径是一个额外的步骤。我认为绑定完整的 Popover
而不仅仅是 List
也更有意义。具有整洁的副作用,您可以使用 TableEntity
的 属性 作为 Popover
的标题。它还完全避免了直接使用控件(这是七大罪之一),您应该能够删除所有这些 ID。