注入器(injector)


1.0    注入器/injector

注入器是AngularJS框架實現和應用開發的關鍵,這是一個DI/IoC容器的實現。

AngularJS將功能分成了不同類型的組件分別實現,這些組件有一個統稱 - 供給者/provider, 下圖中列出了AngularJS幾個常用的內置服務:

 
 

AngularJS的組件之間不可以互相直接調用,一個組件必須通過注入器才 可以調用另一個組件。這樣的好處是組件之間相互解耦,對象的整個生命周期的管理 甩給了注入器。

注入器實現了兩個重要的功能:

集中存儲所有provider的配方

配方其實就是:名稱+類構造函數。AngularJS啟動時,這些provider首先使用其配方在注入器 內注冊。比如,http請求服務組件封裝在$httpProvider類內,它通過"$http"這個名字在注入 器內注冊。

按需提供功能組件的實例

其他組件,比如一個用戶的控制器,如果需要使用http功能,使用"$http"這個名字 向注入器請求,就可以獲得一個http服務實例了。

試着修改→_→的代碼,查看下$compile服務到底是什么?

 

2.0    注冊服務組件

從injector的角度看,組件就是一個功能提供者,因此被稱為供給者/Provider。 在AngularJS中,provider以JavaScript類(構造函數)的形式封裝。

 
 

服務名稱通常使用一個字符串標識,比如"$http"代表http調用服務、"$rootScope"代表根 作用域對象、"$compile"代表編譯服務...

Provider類要求提供一個$get函數(類工廠),injector通過調用該函數, 就可以獲得服務組件的實例。

名稱和類函數的組合信息,被稱為配方。injector中維護一個集中的配方庫, 用來按需創建不同的組件。這個配方庫,其實就是一個Hash對象,key就是服務名稱,value 就是類定義。

在→_→的示例中,我們定義了一個簡單的服務類,這個服務類的實例就是一個字符串:“hello,world!”。 我們使用"ezHello"作為其服務名在注入器里注冊,並通過注入器將這個實例顯示出來。

 

 

3.0   獲得注入器對象

要使用AngularJS的功能,必須首先獲取注入器。有兩種方法取得注入器。

創建一個新的注入器

可以使用angular.injector()創建一個新的注入器:

angular.injector(modules,[strictDi]);

獲取已經創建的注入器

如果AngularJS框架已經啟動,那么可以使用DOM對象的injector()方法獲 得已經創建的注入器:

varelement=angular.element(dom_element);

varinjector=element.injector();

通過注入器調用API

注入器有兩個方法可供進行API調用:invoke()和get()。

invoke()

使用注入器的invoke()方法,可以直接調用一個用戶自定義的函數體,並通過函數參數 注入所依賴的服務對象,這是AngularJS推薦和慣例的用法:

angular.injector(['ng'])

.invoke(function($http){

//do sth. with $http

});

get()

也可以使用注入器的get()方法,獲得指定名稱的服務實例:

varmy$http=angular.injector(['ng']).get('$http');

//do sth. with my$http

→_→的示例這次使用了get()方法直接獲取一個服務實例,感受一下

 

鏈接:https://www.jianshu.com/p/442a5e602c95

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM