编辑:我只是不知道为什么,但是更改检测在层次结构中的第一个孩子处停止。如果我在更高级别(sch-job-detail
中)手动调用更改检测,则会更新这些值。
我已经建立了一个MatTable
,具有可扩展的行。
“可扩展”行部分如下:
<!-- Hidden cell -->
<ng-container matColumnDef="expandedDetail">
<td mat-cell *matCellDef="let jobModel" [attr.colspan]="displayedColumns.length">
<div
class="detail-cell"
*ngIf="jobModel.isExpanded"
[@detailExpand]
>
<sch-job-detail
[jobModel]="jobModel"
...
></sch-job-detail>
</div>
</td>
</ng-container>
如您所见,该表拥有一个JobModel
数组,并且每一行都有自己的JobModel
实例。
JobModel
是FormGroup
的包装,它也是简单接口对象Job
的“换位”。
sch-job-detail
具有其他子组件,例如:
<!-- Toolbar -->
<div class="col">
<sch-job-row-toolbar
[isNew]="jobModel.isNew"
[isEdit]="jobModel.isEdit"
[isError]="jobModel.isError"
[isValid]="jobModel.isValid"
...
></sch-job-row-toolbar>
</div>
在可展开的行上,我有一个按钮,允许用户输入新的Cron表达式,然后将该Cron表达式添加到FormGroup
的{{1}}。
在FormControl
内:
TableComponent
public addCronExpression(jobModel: JobModel): void {
this.matDialog
.open<CronDialogSmartComponent, any, string>(CronDialogSmartComponent)
.afterClosed()
.pipe(filter<string>(c => !!c))
.subscribe(c => {
jobModel.addCronExpression(c)
this.changeDetector.detectChanges()
}
)
}
:
JobModel#addCronExpression
如您所见,由于我没有更改public addCronExpression(cronExpression: string): void {
const cronExpressions = this.formGroup.controls.cronExpressions
cronExpressions.setValue([...cronExpressions.value, cronExpression])
}
实例,因此我运行JobModel
更新了detectChanges
及其子代,其中包括TableComponent
!
问题是sch-job-row-toolbar
似乎没有重新计算其绑定(ngOnChanges不运行)。
这些值:
sch-job-row-toolbar
没有改变。
我们可以以[isNew]="jobModel.isNew"
[isEdit]="jobModel.isEdit"
[isError]="jobModel.isError"
[isValid]="jobModel.isValid"
为例:
JobModel#isEdit
我不知道发生了什么,但是我知道如果我确实在其他地方按下按钮或切换选项卡,get isEdit(): boolean {
return this.formGroup.dirty || Job.isEdit(this.job.status)
}
将收到更新的值。
所有组件都使用sch-job-row-toolbar
策略。
尝试使用onPush
更改检测策略,但结果相同。
答案 0 :(得分:0)
为什么不使用 @Input
和 @Output
来检测从父组件到子组件的更改?
我建议您使用 @Input (parent => child)
并使用 @Output (child=> parent
) 而不是 detectChanges()
。