[英]Calling Javascript function from another file 'Cannot read property of undefined'
[英]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 只有一個id
為label0
的Label
。
我收到以下錯誤:
未捕獲的類型錯誤:無法讀取未定義的屬性“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.