angular:2.0.0-beta.9
是否可以将非@Injectable
类注入component
?例如,此类可能来自第三方库。
答案 0 :(得分:7)
是的,这是可能的。事实上,@Injectable
装饰器不是要指定一个类可注入其他类,而是要在其构造函数级别注入一些东西。
如果您不想在课堂上注入某些内容,则不必添加@Injectable
装饰器。这个类可以注入其他类。
我认为这个Github问题可以帮到你:
这里重要的是理解装饰器和注释之间的区别。这是一篇关于这个主题的精彩文章:
答案 1 :(得分:2)
我认为是可能的。我没有@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修饰。打字稿 使用装饰器和任何装饰器为任何类生成元数据 会做的。
有关详细信息,请参阅此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]);