[英]Angular2: Inject a non @Injectable class
角度:2.0.0-beta.9
是否可以將非@Injectable
類注入component
? 例如,此類可能來自第三方庫。
是的,這是可能的。 事實上, @Injectable
裝飾器不是要指定一個類可注入到其他類中,而是要在其構造函數級別注入一些內容。
如果您不想在類中注入某些內容,則不必添加@Injectable
裝飾器。 這個類可以注入其他類。
我認為這個Github問題可以幫助你:
這里重要的是理解裝飾器和注釋之間的區別。 這是一篇關於這個主題的好文章:
我想是的,這是可能的。 我沒有@Injectable
裝飾器測試它,它工作正常。
AuthService.ts
import {Injectable} from 'angular2/core';
import {Http, Response,HTTP_PROVIDERS} from 'angular2/http';
import 'rxjs/Rx';
import {Observable} from 'rxjs/Observable';
export interface sharedObject{
firstName:string;
lastName:stirng;
}
export class AuthService{
user:sharedObject;
constructor()
{
console.log('AuthService started')
this.user={firstName:"micronyks",lastName:"shah"};
}
change() {
console.log('change to angular2');
this.user.firstName="micronyks1";
this.user.lastName="shah1";
}
}
如果你想知道,因為某些類,在構造函數中使用DI而不使用@Injectable()
。 因為這裝飾了@,例如@Components
。
HeroesComponent也有一個注入依賴。 為什么我們不將@Injectable()添加到HeroesComponent?
如果我們真的想要,我們可以添加它。 沒有必要,因為HeroesComponent已經用@Component修飾。 TypeScript使用裝飾器為任何類生成元數據,任何裝飾器都可以。
有關更多信息,請閱讀此鏈接Angular頁面
如果該類具有依賴關系,您仍然可以在DI中使用它。 只為它提供一個工廠
如果您希望能夠注入一個本身具有依賴項(構造函數參數)但不想要或不能應用@Injectable()
,那么您可以使用工廠代替
bootstrap(AppComponent, [
SomeDep,
provide(SomeType, {useFactory: (dep) => new SomeType(dep),
deps: [SomeDep]})
]);
您可以為這些提供程序創建變量,以便在沒有這種繁瑣的聲明的情況下輕松地重用它們(例如HTTP_PROVIDERS
)
export const SOME_TYPE_PROVIDERS: any[] = [
SomeDep,
provide(SomeType, {useFactory: (dep) => new SomeType(dep),
deps: [SomeDep]})
];
然后像使用它一樣
bootstrap(AppComponent, [SOME_TYPE_PROVIDERS]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.