使用 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。