2014-12-08 53 views

回答

2

configBlocks存儲模塊配置期間被實例化的服務的列表:被加載的模塊之後調用方法的列表

angular.module("ng")._configBlocks[0][0] 

invokeQueue存儲:

var foo = angular.module("ng"); 
foo.constant(alert) 
foo._invokeQueue[0] 
foo._invokeQueue[0][2][0] 

module定義位於AngularJS源代碼的第一行。正如文件所述,每個module操作的使用壽命可以分爲兩個階段。階段config階段和run階段。通過調用angular.module()構造函數公開的對象爲我們提供了這兩種方法。 run方法的功能非常明顯。它只是將config函數傳遞給run塊的私有列表。相反,config方法並不那麼明顯。這裏,什麼config方法執行:

invokeLater私有方法插入的provider組合及其方法到內部模塊隊列被噴射器實例化期間以後調用。如果不是注射器,模塊將完全無用。 CreateInjector函數是具體實現,它具有私有方法loadModules

loadModules函數做,除其他外,其被傳遞給它的模塊的開球。它返回所有相互依賴的模塊的所有run塊的一個數組。噴油器通過其invoke方法調用它們。最後但並非最不重要的一點,loadModules函數在遍歷所有相關模塊期間,分別調用其存儲在_invokeQueue_configBlock處的函數。在最後位置調用run塊。這意味着模塊的所有服務和方法已經公開並準備好使用。相反,config方法僅適用於模塊公開的提供者。提供者的構造函數存儲在模塊的_invokeQueue中。

兩個噴射器

的第一噴射器,即沒有公開暴露,是提供者的一個噴射器。第二個是實例注入器。實例注入器向提供者緩存詢問所需的構造函數。然後它調用提供程序的適當部分並創建一個實例。在請求提供程序注入器之前,實例注入器在提供程序緩存中搜索。 module.provider方法暴露了提供者注入器的提供者方法,仔細觀察後提供了很多關於服務生命週期的信息。

即使角度結構的其他部分(如指令和控制器)在提供程序的緩存中註冊爲提供程序。然後通過$provide.provider方法將$ compileProvider本身註冊爲任何其他提供者。事實上,作爲第一步,module.factory,module.servicemodule.provider將實例存儲在提供者緩存中。但它是我們掌握的實例注入器。實例注入器要求提供者緩存作爲第一步,然後調用invoke方法,該方法負責處理依賴關係。

參考