我有两个控制器和一个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。我收到以下错误:未捕获的TypeError:无法读取未定义的属性'byId'每当我到达这条线:this.getView().byId("label0").setText(text)但是,如果将其放置在onInit控制器2的中:this.getView().byId("label0").setText("bananas")那么标签将正确更改为“香蕉”。我想念什么?
1 回答
哔哔one
TA贡献1854条经验 获得超8个赞
该方法sap.ui.controller将返回一个新的控制器实例,如文档中所述:
如果仅给出名称,则返回命名控制器类的新实例。
因此,它很可能会返回与视图不关联的控制器的副本,因此将找不到该副本。该方法本身也已被弃用,因此,我不建议在较新的UI5版本上一般使用该方法。
在两个控制器之间进行通信的首选方式是使用sap.ui.core.EventBus。
在第二个控制器中,您首先要订阅中的事件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方法的值。
添加回答
举报
0/150
提交
取消
