【问题标题】:Angular2 Inject components into other componentsAngular2 将组件注入到其他组件中
【发布时间】:2015-09-18 21:56:52
【问题描述】:

我在搞乱 Angular2,我希望能够基于引导绑定将一个组件注入另一个组件。

class HelloComponent {
    name: string;
}

@Component({
    selector: 'hello'
}
@View({
    template: `<h3>Hello {{ name }}</h3>`
})
class HelloBobComponent extends HelloComponent {
    constructor() {
        this.name = 'Bob';
    }
}

@Component({
    selector: 'app'
}
@View({
    directives: [HelloComponent]
    template: `<h1>Welcome to my Angular2 app</h1>
                <hello></hello>`
}
class AppComponent {
}

bootstrap(AppComponent, [
    bind(HelloComponent).toClass(HelloBobComponent)
]);

这里我使用 HelloComponent 作为我希望 Angular2 的 Injector 解析 HelloBobComponent 的令牌。我这样做是为了可以根据当前的应用程序配置交换组件。上面的例子显然是行不通的。这可能使用其中一种框架装饰器吗?通过博客或来源我还没有找到答案。

编辑:澄清一下,我如何在 View 装饰器上获取指令属性以将 HelloComponent 视为 di 标记而不是类型。

【问题讨论】:

  • 看看这个answer你的问题是不是有人在聊天室里问的。从那里阅读@pkozlowski 的答案。
  • 感谢您为我指明这个方向。我进行了修改,发现我可以使用指令在组件中显式绑定:[bind(HelloComponent).toClass(HelloBobComponent)]。但是,这对我没有帮助,因为我想从根注入器解决,所以我不必担心在各个组件中配置绑定。

标签: dependency-injection angular


【解决方案1】:

从 alpha37 开始,目前不支持此功能。编译器通过类型或绑定解析在 View 装饰器中传递的指令,但不会从父注入器中查找。

例如:

@View({
  url: '...',
  directives: [
    Directive1,
    bind(Directive2).toClass(Directive2Impl),
  ]
}) 

此处“指令”属性的目的只是为了防止选择器命名冲突。后来添加了绑定支持以帮助测试。

在不编辑编译器函数的情况下,我能想到的唯一解决方案是维护一个外部注入器并解析组件声明的类型。

【讨论】:

  • 我在整个 Beta 版中一直在为此苦苦挣扎。我在重写 DirectiveResolver 时确实有一些初步的运气,它依赖于根注入器来解析基于 DirectiveMetadata 的备用指令。一旦他们引入了 ReflectveInjector,甚至在他们开始优化编译器时,这种情况就被打破了。棺材中的钉子将与预编译组件的视图编译器有关。我的解决方案是维护一个指令注册表,它只是键/指令对的对象。指令:[registry.resolveDirective(someDirectiveToken)]
猜你喜欢
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 2017-08-11
  • 2018-09-14
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多