【问题标题】:Angular 2 Child component to check parent componentAngular 2子组件检查父组件
【发布时间】:2016-11-01 13:11:45
【问题描述】:

我想要实现的是基于哪个组件是其父组件的组件的不同行为。因此,在以下两种情况下,孩子的行为会略有不同。

示例 A

<parent-a>
<child></child>
</parent-a>

示例 B

<parent-b>
<child></child>
</parent-b>

我尝试了以下操作

constructor(
    el: ElementRef) {
      this.el = el; 
  }

  ngAfterViewInit() {
    const hostElem = this.el.nativeElement;
    console.log(hostElem);
    console.log(hostElem.children);
    console.log(hostElem.parentNode);
  }

尽管 ngAfterViewInit 对我来说有点晚了,但我仍然在 parentNode 上得到了 null

有什么方法可以实现这样的目标吗?

【问题讨论】:

  • 这不是它应该如何工作的。相反,将来自父级的输入传递给子级以告诉它如何表现。
  • 是的,它已经做到了(通过服务)但是如果父母不是我期望的人怎么办? (我基本上正在构建一个 Api)。我基本上想用预期的父节点列表给出错误/警告

标签: angular angular2-components


【解决方案1】:

如果您需要实际的组件(而不是节点元素),您可以使用注入器。

constructor(private parentB: ParentBComponent){
}

ngAfterViewInit() {
  this.parentB.someMethod()
}

请注意,您有 parent-aparent-b,如果您希望能够注入任何内容,请定义一个基础组件并让 parent-aparent-b 都继承自它。

你可以让它成为可选的,你可以使用Optional装饰器:

constructor(@Optional() private parentB?: ParentBComponent){
} 

【讨论】:

  • 如果不存在,我猜我可以抛出一个错误。那可能会。我会在接受之前尝试一下;)
  • 如果它不在那个父母的上下文中是什么意思?在这种情况下,成员 parentB 将是未定义的。
  • 一般强烈不建议使用html元素(parentNode等),尽量在框架内做工作,使用Renderer进行更新
  • 我不想更新任何东西。我的问题是,在父级不是 a 或 b 的情况下,编写警告而不执行任何功能
  • 非常感谢,它就像一个魅力,问题是我真的不需要以任何方式使用父组件。我只想知道它们是否存在,如果不存在,我会抛出错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2018-09-15
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
相关资源
最近更新 更多