angular - 在Angular 5中等待子组件初始化
问题描述
export class OrderDetailComponent implements OnInit {
isOpenReviewPDF: boolean;
@ViewChild(forwardRef(() => OrderReviewPdfComponent)) orderReviewPdfComponent: OrderReviewPdfComponent;
ngOnInit() {
}
pulic exportPdf() {
this.isOpenReviewPDF = true;
if (this.orderReviewPdfComponent.isViewInit) {
// How can I wait this code
doSomething();
}
}
}
export class OrderReviewPdfComponent implements OnInit, AfterViewChecked {
public isViewInit = false;
ngOnInit() {
}
ngAfterViewChecked() {
this.isViewInit = true;
}
}
<div *ngIf="isOpenReviewPDF">
<order-review-pdf [commissionIncentive]="commissionIncentive"
[orderEntry]="orderEntry" [siteSurvey]='siteSurvey'></order-review-pdf>
</div>
我在父组件上有 exportPdf() 函数。如何等待这个条件( if(this.orderReviewPdfComponent.isViewInit) )为真运行 doSomething() 函数?目前 doSomething() 从不调用。
解决方案
如果要确保OrderReviewPdfComponent
(子)模板已初始化,可以AfterViewInit
在OrderDetailComponent
ngAfterViewInit
当它的模板和它的孩子的模板被初始化时在一个组件上被调用。所以你应该调用 theexportPdf()
的ngAfterViewInit
方法,OrderDetailComponent
你应该没问题。
export class OrderDetailComponent implements OnInit {
ngOnInit() {}
ngAfterViewInit() {
// You can be sure that the template of OrderDetailComponent
// and any of its child components was initialized in here.
this.exportPdf();
}
pulic exportPdf() {
doSomething();
}
}
现在,如果您想exportPdf
在您的OrderDetailComponent
每次更改时调用您的,那么您可以在您的类型OrderReviewPdfComponent
中创建一个@Output
属性。然后,您可以在每次发生更改时调用它的方法:OrderReviewPdfComponent
EventEmitter
emit
import { ..., Output, ... } from '@angular/core';
export class OrderReviewPdfComponent implements OnInit, AfterViewChecked {
@Output() somethingChanged: EventEmitter<any> = new EventEmitter<any>(null);
ngOnInit() {}
ngAfterViewChecked() {
// This will inform OrderDetailComponent that OrderReviewPdfComponent
// has initialized
this.somethingChanged.emit();
}
...
// Also whenever something changes, just call `this.somethingChanged.emit();`
}
现在在模板中OrderDetailComponent
,你可以somethingChanged
通过做绑定到(somethingChanged)="exportPdf()"
。尝试这个:
<div>
<order-review-pdf
[commissionIncentive]="commissionIncentive"
[orderEntry]="orderEntry"
[siteSurvey]='siteSurvey'
(somethingChanged)="exportPdf()">
</order-review-pdf>
</div>
所以这样,你就不需要你的isOpenReviewPDF
布尔属性OrderDetailComponent
推荐阅读
- maven - 避免为多模块 Maven 项目中的单个模块暂存和部署 Javadoc
- docker - Quarkus Kafka Docker 网络属性
- javascript - 如何在不知道 NextJS 上的静态路径的情况下生成动态页面?
- linux - 如何存储 find 生成的文件,即实际文件和内容作为文件而不是 find 的控制台输出?
- lua - 如何使用 IUP THEME 属性/DEFAULTTHEME 全局属性
- php - 在 Laravel 中以同名保存会话安全吗?
- reactjs - 如何在不刷新页面的情况下在 ReactJS 中重新加载?
- c++14 - 为什么我在二叉树的对角遍历代码中出现 SIGBART 错误?
- winapi - ShowWindow 调用可防止通过 SetLayeredWindowAttribute 更改 alpha
- bash - 如何找出一个数字与文件中下一个相同数字的出现之间有多少行?