Angular2:注入非@Injectable类

时间:2016-03-17 12:40:10

标签: typescript angular

angular:2.0.0-beta.9

是否可以将非@Injectable类注入component?例如,此类可能来自第三方库。

3 个答案:

答案 0 :(得分:7)

是的,这是可能的。事实上,@Injectable装饰器不是要指定一个类可注入其他类,而是要在其构造函数级别注入一些东西。

如果您不想在课堂上注入某些内容,则不必添加@Injectable装饰器。这个类可以注入其他类。

我认为这个Github问题可以帮到你:

这里重要的是理解装饰器和注释之间的区别。这是一篇关于这个主题的精彩文章:

答案 1 :(得分:2)

我认为是可能的。我没有@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修饰。打字稿   使用装饰器和任何装饰器为任何类生成元数据   会做的。

有关详细信息,请参阅此link Angular page

答案 2 :(得分:1)

如果该类具有依赖关系,您仍然可以在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]);