是否可以通知父组件以加载子组件,尤其是在涉及ng-container
和ng-template
时。
如Yes! I see that you've grown strong, my child!
说我们有一个像这样的组件:
@Component({
selector: 'my-app',
template: `
<ng-container *ngIf="!showElse; else elseBlock">
<h1>Hi!</h1>
</ng-container>
<ng-template #elseBlock>
<hello name="{{ name }}"></hello>
</ng-template>
<button (click)="showElse = !showElse">Show else</button>
`,
styles: ['']
})
export class AppComponent {
name = 'Angular';
showElse = false;
@ViewChild('hello') hello: HelloComponent;
}
AppComponent
是否有办法知道HelloComponent
是否已满载?还是我需要在HelloComponent
内部使用自定义解决方案?
我目前正坐在一个不太理想的解决方案上(我不喜欢基于setTimeout()
的东西)。
这就是我的想法:
-将EventEmitter
添加到我的HelloComponent
中;
-使用HelloComponent
的生命周期在ngAfterContentChecked
期间发出事件
-在我的AppComponent
中拦截此事件并执行操作。
您对该主题有何看法?
到目前为止,我已经尝试了您的建议(挂钩AfterViewInit
,使用@ViewChildren
...),但没有成功。
可以肯定的是,我没有<ng-container>...<ng-template>
的东西再次尝试,只是使用HelloComponent
指令隐藏了我的[hidden]
...
通过在HelloComponent
的{{1}}期间发出一个事件并将此事件挂在AfterContentChecked
中,它的工作原理就像一种魅力。 (请参见on stackblitz)
此解决方案比我以前的基于AppComponent
的解决方案更为优雅
现在,我想使用setTimeout
机制的原因是因为我的实际组件只是比示例<ng-container>...<ng-template>
重的微小的。
如果有人有更好的主意继续使用容器模板机制,那我就耳熟能详。
答案 0 :(得分:1)
就像您建议的那样,在生命周期挂钩AfterContentChecked()中使用EventEmitter向您的父组件发出事件。它很简单,并正确使用了Angular的生命周期API。 https://angular.io/guide/lifecycle-hooks#lifecycle-sequence
答案 1 :(得分:0)
您可以附加到AfterViewInit
上,但并非总是如此,请考虑您的子组件上有*ngIf
,那么您需要这样做。
private helloPlaceholder: ElementRef;
@ViewChild('hello') set hello(content: HelloComponent) {
this.helloPlaceholder = content;
// you can check and do your stuff here
}
答案 2 :(得分:0)
您可以在父级组件中使用 ngAfterVIewChecked ,它告诉父级组件angular已完成所有子级的变化检测
因此,如果您有5个子组件,则可以知道所有子视图的更新时间,但是您不知道特定子组件是否已更新