这显然是一种特例(注入浏览器本机窗口对象),但我对为什么仍然需要@Inject()参数-装饰器感到有点困惑,因为我的类已经有了@Injectable()装饰器。
以这个简化的例子为例:
import { provide, bootstrap, Injectable, Inject } from '@angular/core';
@Injectable()
export class Token {
private token: string;
public constructor(token: string, window: Window) {
this.token = window.atob(token);
};
public getToken(): string {
return this.token;
}
}
@Injectable()
export class TokenFactory {
private window: Window;
public constructor(window: Window) {
this.window = window;
}
public createToken(token: string): Token {
return new Token(token, this.window);
}
}
@Component({
template: `
<p *ngFor="let token of tokens">
Encoded: {{token.getToken()}}
</p>
`,
providers: [ TokenFactory ]
})
class MainComponent {
public tokens: Token[];
public constructor(factory: TokenFactory) {
this.tokens = [
factory.create('token-1'),
factory.create('token-2')
];
};
}
bootstrap(
MainComponent, [
provide(Window, { useValue: window })
]);概述:概述:我们有一个令牌类,它表示一个可以在组件或其他服务中多次存在的对象(所以没有单独的对象)。令牌类依赖于全局窗口对象(例如。用于base64编码)。为了使这种可测试性,我们在引导过程中为全局窗口对象定义了一个应用程序范围的提供者,而不是直接在令牌服务中使用它。
主组件需要动态创建令牌,因此我们创建并注入了一个简单的工厂服务TokenFactory,它还需要窗口提供程序(在构造过程中传递令牌类)。
问题:在浏览器中执行错误时失败
Can't resolve all parameters for TokenFactory: (?).但是可以通过将@Inject(窗口)装饰器添加到工厂构造函数窗口参数来修复。
现在,我有点困惑,因为大多数指南/教程都解释说,在用可注入装饰器装饰类时,类型记录中并不需要注入装饰器,那么为什么这个示例不使用@ inject ()装饰器就失败了?
Config:启用了、emitDecoratorMetadata和experimentalDecorators设置,我使用的是TSC1.8.10和angular2 rc.3。
PS:,我也对一般的设计改进开放。
(例如。在生产场景中,我可能只导出令牌接口,而不是导出整个类)
发布于 2016-06-30 13:53:14
我不清楚这个问题到底是关于什么的,但是
为可注入的构造函数参数键入string没有@Inject(...)就没有任何意义
@Injectable()
export class Token {
private token: string;
public constructor(token: string, window: Window) { // <<== invalid
this.token = window.atob(token);
};
public getToken(): string {
return this.token;
}
}而是因为你用它就像
new Token(token, this.window);似乎只有@Injectable()应该从这个类中删除。
关于错误消息:看起来Window没有正确导入,或者它不是类型,而是OpaqueToken或string。
如果依赖项注入应该使用与参数类型不同的键,则需要@Inject()。在您的示例中,Window看起来不是一个类型(类),因此在作为类使用时不能工作。
https://stackoverflow.com/questions/38124727
复制相似问题