结构指令可以使用@ContentChild 来引用子组件吗?

Gar*_*ill 4 angular-directive angular-components angular

如果我有一个自定义指令ParentDirective和自定义组件,ChildComponent如下所示:

<div appParent>
  <app-child></app-child>
</div>
Run Code Online (Sandbox Code Playgroud)

...然后我可以@ContentChild在指令中使用来引用组件:

@ContentChild(ChildComponent) child: ChildComponent;
Run Code Online (Sandbox Code Playgroud)

请参阅此 StackBlitz 的工作原理。(它登录到控制台以显示该child成员已设置)。

但是,如果我将 appParent 更改为结构指令,则child永远不会设置该成员。

<div *appParent>
  <app-child></app-child>
</div>
Run Code Online (Sandbox Code Playgroud)

请参阅此 StackBlitz

不能@ContentChild与结构指令一起使用吗?

sel*_* mn 6

我认为你不能,这是由于 angular 对两种类型的指令使用的设计。创建指令 viaTemplateRef并通过createEmbeddedViewof注入它会将ViewContainerRef 模板生成为 dom 中的兄弟,而不是 child。因此,Angular 的注入也尊重了这一点,所以孩子和创建的地方不能看到对方。你可以把它画在你的脑海里,作为一个额外的附加层。

这里是源代码createEmbeddedView

  createEmbeddedView(context: any): EmbeddedViewRef<any> {
    return new ViewRef_(Services.createEmbeddedView(
        this._parentView, this._def, this._def.element !.template !, context));
  }
Run Code Online (Sandbox Code Playgroud)

如您所见,它返回一个新的ViewRef注入您的context.

更多细节在这里。

  • 谢谢你。这不是我*想要*的答案,但很高兴知道。 (3认同)