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

时间:2019-05-02 21:26:20

标签: javascript sapui5

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

这就是我从第一个调用第二个控制器的功能的方式:

sap.ui.controller("project.controller.one").set("pancakes");

这是第二个控制器中的功能:

set: function (text) {
    alert(text);
    this.getView().byId("label0").setText(text);
}

XML仅有一个Label和一个idlabel0的XML。

我收到以下错误:

  

未捕获的TypeError:无法读取未定义的属性'byId'

只要我到达此行:

this.getView().byId("label0").setText(text)

但是,如果我将其放置在第二个控制器的onInit

this.getView().byId("label0").setText("bananas")

然后标签将正确更改为“香蕉”。

我想念什么?

1 个答案:

答案 0 :(得分:2)

方法sap.ui.controller返回一个新的控制器实例,如documentation所述:

  

如果仅给出名称,则返回命名控制器类的新实例。

因此它很可能返回与视图不相关的控制器的副本,因此将找不到该副本。该方法本身也已被弃用,因此我不建议在较新的UI5版本上一般使用该方法。

两个控制器之间进行通信的首选方式是使用sap.ui.core.EventBus

在第二个控制器中,您将首先subscribeonInit中的事件,并将其绑定到函数:

onInit: function() {
    sap.ui.getCore().getEventBus().subscribe("Controller2", "set", this.setFromEvent, this);
    // ....
}

第一个和第二个参数是通道和事件名称,您可以自由选择。第三个参数是要调用的方法,第四个参数将用作该方法内部this的值。

为了触发事件,可以在其他控制器中使用EventBus的publish方法:

sap.ui.getCore().getEventBus().publish("Controller2", "set", { value: "pancakes" });

第一个和第二个参数是与上面的订阅对应的频道和事件名称。第三个参数是可以发送数据的对象,可以自由选择。

当然,您还需要在第二个控制器中创建setFromEvent方法:

setFromEvent: function(sChannelId, sEventId, oData) {
    this.set(oData.value);
}

此方法的参数与上面传递给publish方法的值相对应。