Warm tip: This article is reproduced from serverfault.com, please click

其他-使用bindElement填充时,弹出框中的SAPUI5 sap.m.list为空

(其他 - SAPUI5 sap.m.list in a popover is emtpy when populated using bindElement)

发布于 2020-11-30 20:30:34

我有一个具有不同列的表(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);

如何获得第二个显示列表中数据的方案?

Questioner
Cruncher
Viewed
0
Marc 2020-12-01 20:03:07

我建议第三个解决方案:

在表行上按时,使用oContext = oClickedRow.getBindingContext()或类似方法获取当前行的绑定上下文此上下文应指向/TableEntity('123456')

应用这种情况下你要Popover使用oPopover.setBindingContext(oContext)

现在,你Popover具有与表行相同的上下文。XML在第二种情况下应该看起来像。

使用路径是imo的额外步骤。我认为绑定完整Popover而不是唯一的绑定也更有意义List具有整洁的副作用,你可以将你的属性TableEntity用作标题Popover它还完全避免直接使用控件(这是七个致命的错误之一),你应该能够删除所有这些ID。