我有两个控制器和一个XML文件。我想从第一个控制器调用第二个控制器的功能。该功能应该更改与第二个控制器关联的xml文件的文本。
这就是我从第一个调用第二个控制器的功能的方式:
sap.ui.controller("project.controller.one").set("pancakes");
这是第二个控制器中的功能:
set: function (text) {
alert(text);
this.getView().byId("label0").setText(text);
}
XML仅有一个Label
和一个id
为label0
的XML。
我收到以下错误:
未捕获的TypeError:无法读取未定义的属性'byId'
只要我到达此行:
this.getView().byId("label0").setText(text)
但是,如果我将其放置在第二个控制器的onInit
中
this.getView().byId("label0").setText("bananas")
然后标签将正确更改为“香蕉”。
我想念什么?
答案 0 :(得分:2)
方法sap.ui.controller
返回一个新的控制器实例,如documentation所述:
如果仅给出名称,则返回命名控制器类的新实例。
因此它很可能返回与视图不相关的控制器的副本,因此将找不到该副本。该方法本身也已被弃用,因此我不建议在较新的UI5版本上一般使用该方法。
两个控制器之间进行通信的首选方式是使用sap.ui.core.EventBus
。
在第二个控制器中,您将首先subscribe到onInit
中的事件,并将其绑定到函数:
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方法的值相对应。