簡體   English   中英

通過另一個控制器調用函數時無法讀取未定義的屬性“byId”

[英]Cannot read property 'byId' of undefined when calling function through another controller

我有兩個控制器和一個 XML 文件。 我想從第一個控制器調用第二個控制器的函數。 該函數應該更改與第二個控制器關聯的 xml 文件的文本。

這就是我從第一個控制器調用第二個控制器的功能的方式:

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

這是第二個控制器中的函數:

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

XML 只有一個idlabel0Label

我收到以下錯誤:

未捕獲的類型錯誤:無法讀取未定義的屬性“byId”

每當我到達這條線時:

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

但是,如果我將它放在控制器二的onInit中:

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

然后標簽將更改為“bananas”,沒有錯誤。

我錯過了什么?

sap.ui.controller方法返回一個新的控制器實例,如文檔中所述

如果僅給出名稱,則返回命名控制器類的新實例。

所以它可能會返回一個與視圖無關的控制器副本,因此它不會找到它。 該方法本身也已棄用,因此我一般不建議在較新的 UI5 版本上使用它。

兩個控制器之間的首選通信方式是使用sap.ui.core.EventBus

在第二個控制器中,您將首先訂閱onInit的事件,並將其綁定到一個函數:

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

第一個和第二個參數是通道和事件名稱,您可以自由選擇。 第三個參數是要調用的方法,第四個參數將用作該方法內部的this值。

為了觸發事件,您可以在其他控制器中使用 EventBus 的發布方法:

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

第一個和第二個參數是與您上面的訂閱對應的頻道和事件名稱。 第三個參數是一個可以發送數據的對象,可以自由選擇。

當然,您還需要在第二個控制器中創建setFromEvent方法:

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

此方法的參數對應於傳遞給上述發布方法的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM