需要一些提供OpaqueToken的帮助。使用Angular 2 beta-12。如果提供者密钥是字符串,它可以正常工作,但在使用OpaqueToken时不起作用。在Child类中,SF未定义。
家长班:
export let SF = new OpaqueToken('sf');
export class A {
testMsg: string = 'hello';
}
@Component({
template: `<child></child>`,
providers: [
provide(SF, {useValue: A}),
provide('justString', {useValue: 'hi'})
]
})
export class App {}
儿童班:
import {Component, Injector, Inject, OpaqueToken} from 'angular2/core'
import {SF, A} from './app'
console.log("******", SF); // undefined
@Component({
selector: 'child',
template: `
$$CHILD Rendered$$ {{a}}
`
})
export class Child {
//constructor(@Inject(SF) private a: A) {} // doesn't work
constructor(@Inject('justString') private a: string) {}
}
我得到的例外:
angular2.min.js:17EXCEPTION:无法解析&#39; Child&#39;(@ Inject(undefined))的所有参数。确保所有参数都使用Inject进行修饰或具有有效的类型注释以及“孩子”。用Injectable装饰。
答案 0 :(得分:9)
这是因为您在包含父类和子类的模块之间存在循环依赖关系。
如果您将不透明令牌定义为第三个模块并将其包含在其他模块中,它将起作用。
例如一个常量模块:
export let SF = new OpaqueToken('sf');
在另外两个模块中:
import { SF } from './constants';
答案 1 :(得分:2)
使用 InjectionToken 替换角度为4或更高的 OpaqueToken 。
因为 OpaqueToken 已弃用
http://stackoverflow.com/questions/43419050/angular-2-opaquetoken-vs-angular-4-injectiontoken
答案 2 :(得分:1)
我假设您的父类和子类位于不同的文件中,并且您将Child
导入到父文件中,因此您可以将其放在{{1}的directives
中装饰器(你没有在你的例子中做过这个,但是否则Parent
根本不会被实例化,显然情况并非如此)。
在这种情况下,您需要对父类文件中定义的子类文件中使用的任何内容使用forwardRef
,必须首先加载该文件,因为它已导入父类,因此不知道随后加载的文件中定义的任何内容(没有Child
的解决方法)
所以,
forwardRef
应该在哪里工作
import {forwardRef} from "angular2/core";
...
constructor(@Inject(forwardRef(()=>SF)) private a: A) {}
失败。
旁注:constructor(@Inject(SF) private a: A) {} // doesn't work
,其中provide(SF, {useValue: A})
是对类而不是实例的引用,闻起来很腥。我不会推测你正在做什么,但我会说,A
与实例的引用一起使用并使用useValue
更为典型引用一个类。