Mer*_*ott 9 dependency-injection decorator typescript angular
有没有办法使用Angular的DI将依赖项注入装饰器工厂?我们将以下代码作为简化示例:
@Component({
selector: 'hello-component',
template: '<div>Hello World</div>'
})
export class HelloComponent {
@PersonName()
name: string;
ngAfterViewInit() {
console.log(`Hello, ${this.name}`);
}
}
Run Code Online (Sandbox Code Playgroud)
这里,PersonName装饰器的预期行为是它访问Person依赖项,并使用它来设置name类的属性.
是否有可能PersonName为上面的代码实现装饰器?
目前,要将依赖项注入我的装饰器(以及其他额外的模块类),我正在使用此解决方法:
import {Injectable, Injector} from "@angular/core";
@Injectable()
export class ExtraModuleInjector {
private static injector;
public static get(token: any) {
if (ExtraModuleInjector.injector) {
return ExtraModuleInjector.injector.get(token);
}
}
constructor(public injector: Injector) {
ExtraModuleInjector.injector = injector;
}
}
Run Code Online (Sandbox Code Playgroud)
在注入根组件后,它允许使用静态get方法在运行时函数执行期间获取依赖关系.仍在寻找更好的解决方案.
这样做有点棘手,因为装饰器是在构建时执行的,而不是在运行时执行。当执行装饰器时,没有该类的实例。
回到 ng2.beta.10,我用它从服务中获取数据(不要认为你可以从组件中获取数据,但我可能是错的......):
// some-route.ts
@CanActivate((next, prev) => {
let store: any = getSingleton(Store);
})
// injector.ts
import {Injector} from 'angular2/core'
let appInjectorRef: Injector;
export const appInjector = (injector?: Injector) => {
if (injector)
appInjectorRef = injector;
return appInjectorRef;
}
export function getSingleton(token: any) {
let injector: Injector = appInjector();
return injector.get(token);
}
Run Code Online (Sandbox Code Playgroud)
..说实话,现在看这段代码我不知道它是如何工作的(;但我知道当时确实如此。不确定现在的状态,或者自 beta.10 以来是否有任何与注入器相关的重大更改和应用参考...
| 归档时间: |
|
| 查看次数: |
4748 次 |
| 最近记录: |