簡體   English   中英

Angular2:注入非@Injectable類

[英]Angular2: Inject a non @Injectable class

角度:2.0.0-beta.9

是否可以將非@Injectable類注入component 例如,此類可能來自第三方庫。

是的,這是可能的。 事實上, @Injectable裝飾器不是要指定一個類可注入到其他類中,而是要在其構造函數級別注入一些內容。

如果您不想在類中注入某些內容,則不必添加@Injectable裝飾器。 這個類可以注入其他類。

我認為這個Github問題可以幫助你:

這里重要的是理解裝飾器和注釋之間的區別。 這是一篇關於這個主題的好文章:

我想是的,這是可能的。 我沒有@Injectable裝飾器測試它,它工作正常。

plunker

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM