【问题标题】:angular 2 OpaqueToken角 2 OpaqueToken
【发布时间】:2016-07-25 23:07:13
【问题描述】:

在提供 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: 无法解析 'Child' 的所有参数(@Inject(undefined))。确保所有参数都用 Inject 修饰或具有有效的类型注释,并且 'Child' 用 Injectable 修饰。

【问题讨论】:

    标签: angular


    【解决方案1】:

    这是因为在包含父类和子类的模块之间存在循环依赖关系。

    如果您将不透明令牌定义到第三个模块中并将其包含在其他模块中,它将起作用。

    例如一个常量模块:

    export let SF = new OpaqueToken('sf');
    

    在另外两个模块中:

    import { SF } from './constants';
    

    【讨论】:

      【解决方案2】:

      使用 InjectionToken 替换为 angular 4 或更新版本中的 OpaqueToken

      因为 OpaqueToken 已被弃用

      http://stackoverflow.com/questions/43419050/angular-2-opaquetoken-vs-angular-4-injectiontoken

      【讨论】:

        【解决方案3】:

        我假设您的父类和子类位于不同的文件中,并且您将 Child 导入到父文件中,因此您可以将其放入 Parent 装饰器的 directives 中(您还没有在您的示例中完成了此操作,但否则 Child 根本不会被实例化,显然情况并非如此)。

        在这种情况下,您需要在子类文件中使用的父类文件中定义的任何内容上使用forwardRef,因为它被导入到父类中,因此必须首先加载,因此不是私有的到随后加载的文件中定义的任何内容(没有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 用于引用实例和useClass 用于引用类更为典型。

        【讨论】:

        • 感谢您的帮助,@drewmoore 确实有效。奇怪的是,在我见过的任何例子中都没有提到它。事实上 angular.io 参考文档谈到 forwardRef 仅在同一文件中的组件之后声明类时才需要。现在注射部位看起来有些不友好。啊。您是否以这种方式使用 OpaqueTokens?我现在的用例只是将全局对象放入组件上下文中。
        猜你喜欢
        • 2017-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-16
        • 1970-01-01
        • 2017-01-25
        • 2017-04-12
        相关资源
        最近更新 更多