为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

三国纷争 2021-05-10 17:32:09
我有两个控制器和一个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方法的值。


查看完整回答
反对 回复 2021-05-20
  • 1 回答
  • 0 关注
  • 272 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号