Angular?@Injectable注解的工作原理解析
正文
下面是 SAP 電商云 Spartacus UI 兩個 Angular Service 類,都加上了 @Injectable
的注解,區(qū)別就在于是否具有輸入?yún)?shù) providedIn
:
@Injectable() 裝飾器
@Injectable() 裝飾器指定 Angular 可以在 DI 系統(tǒng)中使用這個類。
這個注解的輸入元數(shù)據(jù),providedIn: 'root',意味著被注解的 Angular service 類,在整個應用程序中都是可見的。
當將服務(提供者)注入到我們的組件/服務中時,通過構(gòu)造函數(shù)中的類型定義來指定我們需要的提供者。下面是一個例子:
import { Component } from '@angular/core'; import { Http } from '@angular/http'; @Component({ selector: 'example-component', template: '<div>I am a component</div>' }) class ExampleComponent { constructor(private http: Http) { // use `this.http` which is the Http provider } }
這里的類型定義是 Http(注意大寫的 H),Angular 會自動將其分配給 http。
瀏覽器中運行時的http參數(shù)
對于 JavaScript 開發(fā)人員來說,上面的工作方式或許有些神奇。類型定義是特定于 TypeScript 的,所以我們編譯的 JavaScript 代碼理論上應該不知道在瀏覽器中運行它時我們的 http 參數(shù)是什么。
在我們的 tsconfig.json 文件中,我們將 emitDecoratorMetadata 設置為 true。 這會將有關(guān)參數(shù)類型的元數(shù)據(jù)發(fā)送到我們編譯的 JavaScript 輸出中的裝飾器中。
讓我們看看上面列舉的 TypeScript 代碼,實際上被編譯成什么(為了清楚起見,我保留了 ES6 導入):
import { Component } from '@angular/core'; import { Http } from '@angular/http'; var ExampleComponent = (function() { function ExampleComponent(http) { this.http = http; } return ExampleComponent; })(); ExampleComponent = __decorate( [ Component({ selector: 'example-component', template: '<div>I am a component</div>', }), __metadata('design:paramtypes', [Http]), ], ExampleComponent );
從這里,我們可以看到編譯后的代碼,知道 http 就是 @angular/http 提供的 Http 服務 - 它被添加為我們的類的裝飾器:
__metadata('design:paramtypes', [Http]);
所以本質(zhì)上,@Component 裝飾器被轉(zhuǎn)換為普通的 ES5,并且一些額外的元數(shù)據(jù)通過 __decorate 賦值提供。 這反過來告訴 Angular 查找 Http 令牌并將其作為第一個參數(shù)提供給組件的構(gòu)造函數(shù) - 將其分配給 this.http:
function ExampleComponent(http) { this.http = http; }
以上就是Angular @Injectable 注解的工作原理解析的詳細內(nèi)容,更多關(guān)于Angular @Injectable注解的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Angular.js中定時器循環(huán)的3種方法總結(jié)
這篇文章主要給大家總結(jié)了angular.js中定時器循環(huán)的3種方法,分別是利用$interlval實現(xiàn)、$timeout的遞歸調(diào)用來實現(xiàn)以及$timeout借助arguments.callee來實現(xiàn),每種方法都給出了詳細的示例艾瑪供大家學習參考,需要的朋友們下面跟著小編一起來學習學習吧。2017-04-04AngularJS ng-bind-html 指令詳解及實例代碼
本文主要是對AngularJS ng-bind-html 指令知識的詳細講解,并附代碼實例,有需要的小伙伴可以參考下2016-07-07Angular 利用路由跳轉(zhuǎn)到指定頁面的指定位置方法
今天小編就為大家分享一篇Angular 利用路由跳轉(zhuǎn)到指定頁面的指定位置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Angularjs的ng-repeat中去除重復數(shù)據(jù)的方法
這篇文章主要介紹了Angularjs的ng-repeat中去除重復數(shù)據(jù)的方法,涉及AngularJS針對重復數(shù)據(jù)的遍歷與過濾技巧,需要的朋友可以參考下2016-08-08利用Angular+Angular-Ui實現(xiàn)分頁(代碼加簡單)
這篇文章主要介紹了利用Angular+Angular-Ui實現(xiàn)分頁,利用Angular+Angular-Ui實現(xiàn)的分頁分頁代碼更加簡單,更加容易懂哦,相信本文的內(nèi)容對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03angular4中*ngFor不能對返回來的對象進行循環(huán)的解決方法
今天小編就為大家分享一篇angular4中*ngFor不能對返回來的對象進行循環(huán)的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09