Javascript 无法读取属性';byId';通过另一个控制器调用函数时的未定义
我有两个控制器和一个XML文件。我想从第一个控制器调用第二个控制器的函数。该函数用于更改与第二个控制器关联的xml文件的文本 这就是我如何从第一个控制器调用第二个控制器的函数:Javascript 无法读取属性';byId';通过另一个控制器调用函数时的未定义,javascript,sapui5,Javascript,Sapui5,我有两个控制器和一个XML文件。我想从第一个控制器调用第二个控制器的函数。该函数用于更改与第二个控制器关联的xml文件的文本 这就是我如何从第一个控制器调用第二个控制器的函数: sap.ui.controller("project.controller.one").set("pancakes"); 这是第二个控制器中的功能: set: function (text) { alert(text); this.getView().byId("label0").setText(tex
sap.ui.controller("project.controller.one").set("pancakes");
这是第二个控制器中的功能:
set: function (text) {
alert(text);
this.getView().byId("label0").setText(text);
}
sap.ui.getCore().getEventBus().publish("Controller2", "set", { value: "pancakes" });
setFromEvent: function(sChannelId, sEventId, oData) {
this.set(oData.value);
}
XML只有一个标签
,其id为label0
我得到以下错误:
未捕获的TypeError:无法读取未定义的属性“byId”
每当我到达这条线:
this.getView().byId("label0").setText(text)
但是,如果我将其放置在控制器2的onInit
中:
this.getView().byId("label0").setText("bananas")
然后标签将更改为“香蕉”,没有错误
我遗漏了什么?方法
sap.ui.controller
返回一个新的控制器实例,如以下所述:
如果只给出一个名称,则返回命名控制器类的新实例
因此,它可能返回一个与视图不关联的控制器副本,因此无法找到它。该方法本身也被弃用,因此我不建议在较新的UI5版本上使用它
两个控制器之间通信的首选方式是使用
在第二个控制器中,您将首先访问onInit
中的事件,并将其绑定到函数:
onInit: function() {
sap.ui.getCore().getEventBus().subscribe("Controller2", "set", this.setFromEvent, this);
// ....
}
第一个和第二个参数是通道和事件名称,您可以自由选择。第三个参数是要调用的方法,第四个参数将用作该方法内部的this
的值
为了触发事件,您可以在其他控制器中使用EventBus的方法:
set: function (text) {
alert(text);
this.getView().byId("label0").setText(text);
}
sap.ui.getCore().getEventBus().publish("Controller2", "set", { value: "pancakes" });
setFromEvent: function(sChannelId, sEventId, oData) {
this.set(oData.value);
}
第一个和第二个参数是与上述订阅对应的通道和事件名称。第三个参数是可以发送数据的对象,可以自由选择
当然,您还需要在第二个控制器中创建setFromEvent
方法:
set: function (text) {
alert(text);
this.getView().byId("label0").setText(text);
}
sap.ui.getCore().getEventBus().publish("Controller2", "set", { value: "pancakes" });
setFromEvent: function(sChannelId, sEventId, oData) {
this.set(oData.value);
}
此方法的参数与传递给上述发布方法的值相对应。该方法
sap.ui.controller
返回一个新的控制器实例,如下所述:
如果只给出一个名称,则返回命名控制器类的新实例
因此,它可能返回一个与视图不关联的控制器副本,因此无法找到它。该方法本身也被弃用,因此我不建议在较新的UI5版本上使用它
两个控制器之间通信的首选方式是使用
在第二个控制器中,您将首先访问onInit
中的事件,并将其绑定到函数:
onInit: function() {
sap.ui.getCore().getEventBus().subscribe("Controller2", "set", this.setFromEvent, this);
// ....
}
第一个和第二个参数是通道和事件名称,您可以自由选择。第三个参数是要调用的方法,第四个参数将用作该方法内部的this
的值
为了触发事件,您可以在其他控制器中使用EventBus的方法:
set: function (text) {
alert(text);
this.getView().byId("label0").setText(text);
}
sap.ui.getCore().getEventBus().publish("Controller2", "set", { value: "pancakes" });
setFromEvent: function(sChannelId, sEventId, oData) {
this.set(oData.value);
}
第一个和第二个参数是与上述订阅对应的通道和事件名称。第三个参数是可以发送数据的对象,可以自由选择
当然,您还需要在第二个控制器中创建setFromEvent
方法:
set: function (text) {
alert(text);
this.getView().byId("label0").setText(text);
}
sap.ui.getCore().getEventBus().publish("Controller2", "set", { value: "pancakes" });
setFromEvent: function(sChannelId, sEventId, oData) {
this.set(oData.value);
}
此方法的参数对应于传递给上述发布方法的值。
console.log(此)
在集合中,查看它是否像控制器。如果是,那么getView()
可能不起作用。然后检查您是否尝试了sap.ui.getCore().byId()
?为什么在两个控制器中有逻辑?控制台.log(此)
在集合中,查看它是否看起来像控制器。如果是,那么getView()
可能不起作用。然后检查您是否尝试过sap.ui.getCore().byId()
?为什么在两个控制器中都有逻辑?