Sapui5 如何从其他页面控制器将ColumnListItem添加到MVC页面内的表中

Sapui5 如何从其他页面控制器将ColumnListItem添加到MVC页面内的表中,sapui5,Sapui5,我有一个用MVC编写的SAPUI5应用程序 我有一个名为oPage4的视图: var landscapePage = new sap.m.Page({ title : "Landscape Name", showNavButton : true, navButtonPress : [oController.back,oController], footer : new sap.m.Bar({ id : 'la

我有一个用MVC编写的SAPUI5应用程序

我有一个名为oPage4的视图:

var landscapePage = new sap.m.Page({
        title : "Landscape Name",
        showNavButton : true,
        navButtonPress : [oController.back,oController],
        footer : new sap.m.Bar({
            id : 'landscapePage_footer',
            contentMiddle : [ 
             new sap.m.Button({

            }),
             new sap.m.Button({

            })
            ]
        }),
});

oLandscapePageTable = new sap.m.Table("landscape", {
        inset : true,
        visible : true,
        getIncludeItemInSelection : true,
        showNoData : false,
        columns : [ new sap.m.Column({
            styleClass : "name",
            hAlign : "Left",
            header : new sap.m.Label({
            })
        }) ]
});

landscapePage.addContent(oLandscapePageTable);
return landscapePage;
然后在page1控制器中,我想在第4页的表中添加一个columnlistitem

var oPage4 = sap.ui.getCore().byId("p4");
var landscapePageRow = new sap.m.ColumnListItem({
    type : "Active",
    visible : true,
    selected : true,
    cells : [ new sap.m.Label({
        text : something
    }) ]
});
oPage4.getContent().addItem(landscapePageRow);

它不起作用。请告诉我怎么做?

好的,我想我现在明白你的问题了。一般来说,我会避免调用页面并从另一个视图对其进行操作。但是,绝对有可能:

视图中的其他功能 您可以通过一些可以从外部调用的函数来扩展
page4
,如下所示:

sap.ui.jsview("my.page4", {

    createContent : function() {
        this.table = ...    
        ...
    },

    addColumnListItem : function(columnListItem) {
        // add it to the table calling this.table ...
    }

}
var page4 = sap.ui.jsview("my.page4");
page4.addColumnListItem(page4, columnListItem);
handleEvent1 : function(channel, event, data) {
    var listItem = data.listItem
}
从另一个角度来看,您现在可以这样调用此函数:

sap.ui.jsview("my.page4", {

    createContent : function() {
        this.table = ...    
        ...
    },

    addColumnListItem : function(columnListItem) {
        // add it to the table calling this.table ...
    }

}
var page4 = sap.ui.jsview("my.page4");
page4.addColumnListItem(page4, columnListItem);
handleEvent1 : function(channel, event, data) {
    var listItem = data.listItem
}
注意:页面4对象本身并不指向您返回的控件,而是指向视图实例本身。如果将page4对象记录到控制台,您会注意到这一点。这就是为什么您必须添加如上所述的函数

其他一些方法是使用所描述的EventBus来发布和订阅事件。既然是你自找的,让我告诉你怎么做:

使用事件总线 主要目的是,一个人可以订阅一个特定的事件,其他人可以发布这样的事件到eventbus。让我举个例子:

订阅事件总线:

var eventBus = sap.ui.getCore().getEventBus();
eventBus.subscribe("channel1", "event1", this.handleEvent1, this);
var columnListItem = ...
var eventBus = sap.ui.getCore().getEventBus();

eventBus.publish("channel1", "event1", 
    {
        listItem : columnListItem
    }
);
当然,您可以根据自己的意愿命名频道和事件。第三个参数表示在发布事件时将调用的函数。最后一个参数是给定函数中“this”将指向的范围

您的
handleEvent1
函数可能如下所示:

sap.ui.jsview("my.page4", {

    createContent : function() {
        this.table = ...    
        ...
    },

    addColumnListItem : function(columnListItem) {
        // add it to the table calling this.table ...
    }

}
var page4 = sap.ui.jsview("my.page4");
page4.addColumnListItem(page4, columnListItem);
handleEvent1 : function(channel, event, data) {
    var listItem = data.listItem
}
将事件发布到事件总线:

var eventBus = sap.ui.getCore().getEventBus();
eventBus.subscribe("channel1", "event1", this.handleEvent1, this);
var columnListItem = ...
var eventBus = sap.ui.getCore().getEventBus();

eventBus.publish("channel1", "event1", 
    {
        listItem : columnListItem
    }
);
还有一个选项是根据模型生成columnListItems。就像每次一样,它取决于您的实际架构和数据


让我知道这是否解决了您的问题,或者您是否需要更多信息。

好的,我想我现在理解了您的问题。一般来说,我会避免调用页面并从另一个视图对其进行操作。但是,绝对有可能:

视图中的其他功能 您可以通过一些可以从外部调用的函数来扩展
page4
,如下所示:

sap.ui.jsview("my.page4", {

    createContent : function() {
        this.table = ...    
        ...
    },

    addColumnListItem : function(columnListItem) {
        // add it to the table calling this.table ...
    }

}
var page4 = sap.ui.jsview("my.page4");
page4.addColumnListItem(page4, columnListItem);
handleEvent1 : function(channel, event, data) {
    var listItem = data.listItem
}
从另一个角度来看,您现在可以这样调用此函数:

sap.ui.jsview("my.page4", {

    createContent : function() {
        this.table = ...    
        ...
    },

    addColumnListItem : function(columnListItem) {
        // add it to the table calling this.table ...
    }

}
var page4 = sap.ui.jsview("my.page4");
page4.addColumnListItem(page4, columnListItem);
handleEvent1 : function(channel, event, data) {
    var listItem = data.listItem
}
注意:页面4对象本身并不指向您返回的控件,而是指向视图实例本身。如果将page4对象记录到控制台,您会注意到这一点。这就是为什么您必须添加如上所述的函数

其他一些方法是使用所描述的EventBus来发布和订阅事件。既然是你自找的,让我告诉你怎么做:

使用事件总线 主要目的是,一个人可以订阅一个特定的事件,其他人可以发布这样的事件到eventbus。让我举个例子:

订阅事件总线:

var eventBus = sap.ui.getCore().getEventBus();
eventBus.subscribe("channel1", "event1", this.handleEvent1, this);
var columnListItem = ...
var eventBus = sap.ui.getCore().getEventBus();

eventBus.publish("channel1", "event1", 
    {
        listItem : columnListItem
    }
);
当然,您可以根据自己的意愿命名频道和事件。第三个参数表示在发布事件时将调用的函数。最后一个参数是给定函数中“this”将指向的范围

您的
handleEvent1
函数可能如下所示:

sap.ui.jsview("my.page4", {

    createContent : function() {
        this.table = ...    
        ...
    },

    addColumnListItem : function(columnListItem) {
        // add it to the table calling this.table ...
    }

}
var page4 = sap.ui.jsview("my.page4");
page4.addColumnListItem(page4, columnListItem);
handleEvent1 : function(channel, event, data) {
    var listItem = data.listItem
}
将事件发布到事件总线:

var eventBus = sap.ui.getCore().getEventBus();
eventBus.subscribe("channel1", "event1", this.handleEvent1, this);
var columnListItem = ...
var eventBus = sap.ui.getCore().getEventBus();

eventBus.publish("channel1", "event1", 
    {
        listItem : columnListItem
    }
);
还有一个选项是根据模型生成columnListItems。就像每次一样,它取决于您的实际架构和数据


让我知道这是否解决了您的问题,或者您是否需要更多信息。

您能描述一下“什么”不起作用吗?是否有东西写入开发人员控制台?我看到的第一件事是,您尝试按ID(“p4”)查找page4,但您的page4对象似乎没有ID。Hi Tim p4是拆分应用程序页面中页面的ID,如下所示:var oPage4=sap.ui.view({ID:“p4”,viewName:“mvc2.oPage4”,type:sap.ui.core.mvc.ViewType.JS});我想知道如何在第1页中获取第4页并访问其表并向其中添加ColumnListItem?谢谢,也没有写任何东西来安慰你。你能描述一下“什么”不起作用吗?是否有东西写入开发人员控制台?我看到的第一件事是,您尝试按ID(“p4”)查找page4,但您的page4对象似乎没有ID。Hi Tim p4是拆分应用程序页面中页面的ID,如下所示:var oPage4=sap.ui.view({ID:“p4”,viewName:“mvc2.oPage4”,type:sap.ui.core.mvc.ViewType.JS});我想知道如何在第1页中获取第4页并访问其表并向其中添加ColumnListItem?谢谢你,也没有写任何东西来安慰你。谢谢你的全面解决方案。我通读了你发给我的那一页,我同意你的看法,这是我实现目标的正确途径。不过,我无法百分之百确定如何做到这一点。我想知道你能否给我举个例子。例如如何实例化sap.ui.core.EventBus以及如何在我的应用程序中使用它。顺便说一句,我的应用程序是由一个视图和拆分页控件以及许多其他页面组成的。谢谢你,我还有一个问题要问你,蒂姆。您能告诉我如何调用一个视图的控制器页面,然后调用控制器内的函数吗?我尝试了这一行,但不起作用:sap.ui.jsview(“my.page4”).getController();好的,如果您愿意,请参阅我编辑的关于如何使用EventBus的答案。回答您的最后一个问题:使用sap.ui.jsview(…).getController()确实应该让您能够访问控制器及其函数。我只是又试了一次。也许还有别的地方出了问题。你可以试着调试这个。谢谢你的全面解决方案。我通读了你发给我的那一页,我同意你的看法,这是我实现目标的正确途径。我不能百分之百确定怎么做