gpt4 book ai didi

javascript - 通过另一个 Controller 调用函数时无法读取未定义的属性 'byId'

转载 作者:行者123 更新时间:2023-12-01 01:02:14 25 4
gpt4 key购买 nike

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

这就是我从第一个 Controller 调用第二个 Controller 的函数的方式:

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

这是第二个 Controller 中的函数:

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

XML 只有一个Label,其idlabel0

我收到以下错误:

Uncaught TypeError: Cannot read property 'byId' of undefined

每当我到达这一行时:

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

但是,如果我将其放在 Controller 二的 onInit 中:

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

然后标签将更改为“bananas”,不会出现错误。

我错过了什么?

最佳答案

方法sap.ui.controller返回一个新的 Controller 实例,如documentation中所述。 :

If only a name is given, a new instance of the named controller class is returned.

因此它可能会返回与 View 无关的 Controller 副本,因此它不会找到它。该方法本身也已被弃用,因此我通常不建议在较新的 UI5 版本上使用它。

两个 Controller 之间通信的首选方式是使用 sap.ui.core.EventBus .

在第二个 Controller 中,您首先要 subscribeonInit 中的事件,并将其绑定(bind)到函数:

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

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

为了触发该事件,您可以使用publish您其他 Controller 中的 EventBus 方法:

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

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

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

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

此方法的参数对应于传递给上面的发布方法的值。

关于javascript - 通过另一个 Controller 调用函数时无法读取未定义的属性 'byId',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55960471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com