Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法读取属性';byId';通过另一个控制器调用函数时的未定义_Javascript_Sapui5 - Fatal编程技术网

Javascript 无法读取属性';byId';通过另一个控制器调用函数时的未定义

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

我有两个控制器和一个XML文件。我想从第一个控制器调用第二个控制器的函数。该函数用于更改与第二个控制器关联的xml文件的文本

这就是我如何从第一个控制器调用第二个控制器的函数:

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()
?为什么在两个控制器中都有逻辑?