2017-04-25 109 views
2

從angularjs 1.5遷移到1.6的文檔中提到「禁用(默認情況下)控制器實例上綁定的預分配,這有助於支持本機ES6類。和「依賴於綁定的初始化邏輯應該放在控制器的$ onInit()方法中,該方法保證在綁定被分配後總是被調用。」

我嘗試爲我們的項目做這個遷移,我觀察到一些控制器$ onInit沒有被調用。在官方文檔我沒有找到與此相關的任何東西,但也有一些其他來源:

https://www.tejusparikh.com/2017/universality-oninit-callback-angularjs.html

https://github.com/angular/angular.js/issues/14630

是否有其他情況下,當$ OnInit中不會被調用?這是否被記錄在「更正式」的某處?

謝謝!

+0

你在說他們不會被叫到;你已經把console.log放在它們中,它們不會觸發?不是我們遇到的行爲,而是我們剛剛切換到使用$ onInit()。 – rrd

+0

是的,它們不會因爲用於路由的指令控制器而被解僱。對於(所有?)其他指令,它似乎被解僱。 – sanyi9

+0

我們的路由(例如,保存爲每個目錄的config.routes.js)使用以下結構:export default function config($ stateProvider){...},即沒有與之關聯的控制器。如果你的意思是每個單獨的狀態,導入它,然後設置爲:controller:SomeController,那麼我們也沒有問題。問題可能在別的地方?也許張貼你的路線的例子? – rrd

回答

0

我發現如果你的控制器返回一個對象,那麼$ onInit將不會被觸發。

繼傳統的JS IIFE模塊模式之後,您可以返回一個將公鑰映射到內部方法的對象,從而有效地爲您的私有作用域函數創建一個公共接口。在轉換爲帶有控制器的組件時,我遺漏了部分代碼,發現$ onInit在我刪除「return {};」之前未被調用。在控制器功能的末尾。

我不知道這是否是同樣的原因sanyi9正在處理,但它是$相同的症狀,即使按預期執行控制器的其餘部分(和其它控制器都運行$的OnInit調用的OnInit不會被調用)。