【问题标题】:Parent component to get reference to any sub child components in Angular父组件获取对 Angular 中任何子子组件的引用
【发布时间】:2020-02-12 00:34:48
【问题描述】:

目标是了解如何获取对任何嵌套组件的引用。这是具有 4 个嵌套组件的示例。 A 将 B 作为子组件,B 将 C 作为其子组件,C 将 D 作为动态/运行时创建的子组件。所以问题是Angular是否提供了开箱即用的解决方案:

A 组件如何获取 C 组件的引用?

A 组件如何获取在运行时创建的 D 组件的引用?

@Component({
  selector: 'A',
  template: `<B></B>`
})
export class A {}


@Component({
  selector: 'B',
  template: `<C></C>`
})
export class B {}



@Component({
  selector: 'C',
  template: `<div>C Component</div> <div #container></div>`
})
export class C implements OnInit{
  @ViewChild('container')
  container: TemplateRef<any>;

  constructor(private resolver:ComponentFactoryResolver){}
  ngOnInit() {
    const DFactory= this.resolver.resolveComponentFactory(D);
    this.container.createComponent(DFactory);
  }

}

@Component({
  selector: 'D',
  template: `<div>D component</div>`
})
export class D{}

【问题讨论】:

  • A 组件如何获取 C 组件的引用?组件 B 知道 Component 并且应该公开 ViewChild 组件 C 的属性,因此组件 A 应该有一个 ViewChild 绑定到组件 B。通过 viewchildB 组件 A 应该可以获取组件 B 中的 viewchild C 的属性。
  • A 组件如何获取运行时创建的 D 组件的引用?从最后一个问题开始,在组件 c 中添加一个新的 piublic 属性,该属性将填充 createComponent 函数的结果(返回一个 ComponentRef 对象)。 angular.io/api/core/ViewContainerRef#createComponent
  • 不确定是否可以快速尝试此解决方案

标签: angular angular-components angular8


【解决方案1】:

为了向您展示我的想法,我制作了一个堆栈闪电战。这是工作,但我不确定你到底想要什么,很难猜到。但是从 A 我可以访问 D。 就像我告诉你的那样:

A 组件如何获取 C 组件的引用? 组件 B 知道 Component 并且应该公开 ViewChild 组件 C 的属性,因此组件 A 应该有一个 ViewChild 绑定到组件 B。通过 viewchildB 组件 A 应该可以获取组件 B 中的 viewchild C 的属性。

A组件如何获取运行时创建的D组件的引用? 从最后一个问题开始,在组件 c 中添加一个新的 piublic 属性,该属性将填充 createComponent 函数的结果(返回一个 ComponentRef 对象)。 angular.io/api/core/ViewContainerRef#createComponent

您可以在链接的 stackblitz 上查看此处的代码。 https://stackblitz.com/edit/angular-abvno2

【讨论】:

  • 感谢您的提议,但我看到了一些潜在的问题。通过公共属性公开对组件的引用是高度耦合的方法。是否有在 A 组件级别上使用“@ViewChildren”或“@ContentChildren”的解决方案?无论实际的组件嵌套结构如何,此解决方案都将更加通用。
  • 不幸的是,使用祖父组件中的@ViewChildren 来查询子组件将不起作用。由于孩子被父母包裹,他不会在祖父母的视图 DOM 中,因此他将无法用于查询。但是我们可以尝试从父组件中查询所有子组件。
  • 嗯,也许你是对的。但它看起来仍然是非常有效的场景。用 { descendants: true } 找到了这个例子,但它对我不起作用。您可以尝试一下,也许我们必须将所有内容包装在 ng-content 中才能使其正常工作。 '@ContentChildren(MyInput, { descendants: true }) private inputComps: QueryList;'
  • 您到底需要什么?你想在组件之间共享信息吗?
猜你喜欢
  • 2017-05-25
  • 2016-07-01
  • 2016-07-15
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多