angular 2 OpaqueToken

时间:2016-04-05 20:05:35

标签: angular

需要一些提供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装饰。

3 个答案:

答案 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更为典型引用一个类。