Sapui5 如何从其他页面控制器将ColumnListItem添加到MVC页面内的表中
我有一个用MVC编写的SAPUI5应用程序 我有一个名为oPage4的视图: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
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()确实应该让您能够访问控制器及其函数。我只是又试了一次。也许还有别的地方出了问题。你可以试着调试这个。谢谢你的全面解决方案。我通读了你发给我的那一页,我同意你的看法,这是我实现目标的正确途径。我不能百分之百确定怎么做