跟随所有类实例化的生命周期钩子

时间:2017-10-22 20:56:58

标签: angular

想象一下Angular 4中的以下组件树

                  A
                 / \ 
                B   D
               /     \
              C       E

我想运行一些inside E,但我想确保constructor of C已初始化。 E 上的ngAfterViewInit() 可以保证吗?是否确保所有5个构造函数都在ngAfterViewInit之前进行了初始化?再一次,我想要一些内部的东西,这将保证上述。

3 个答案:

答案 0 :(得分:2)

为什么你不能使用服务?在C的构造函数中,您可以将该服务的标志设置为true。在E组件中,如果服务中的标志值为true,则可以执行简单的条件调用函数。

答案 1 :(得分:1)

没有这样的保证。即使在触发E ngAfterViewInit时C已经被实例化,这可能不适用于其他条件,例如组件是异步编译的。依靠这个优先权是错误的举动。

如果目标是将消息从E发送到C或反之亦然,则应通过共同的父(A)属性或属于父注入器或更高的服务来执行通信。

考虑到观察者将被订阅并发出该值的顺序是不确定的,它应该是可重放的,例如, ReplaySubject。在这种情况下,订阅者将以任何方式接收消息。

考虑将主题定义为

fooSubject = ReplaySubject(1)
组件A中的

和对它的引用传递给C和E,组件E发送消息为fooSubject.next(...),组件C接收为fooSubject.subscribe(...)

答案 2 :(得分:0)

是的,构造函数是第一个运行的生命周期方法,因此应该没有问题。例如,您可以使用构造函数中的console.log和不同组件的ngOnInit轻松地对此进行测试。

编辑:如果没有有条件地或异步地初始化组件,这显然是正确的。