Angular detectChanges在子组件上不起作用

时间:2019-01-15 15:31:09

标签: angular angular-material

编辑:我只是不知道为什么,但是更改检测在层次结构中的第一个孩子处停止。如果我在更高级别(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实例。
JobModelFormGroup的包装,它也是简单接口对象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策略。

说明性GIF: enter image description here

有趣的是,当我从第一个Tab执行相同的操作时,它起作用了! enter image description here

尝试使用onPush更改检测策略,但结果相同。

1 个答案:

答案 0 :(得分:0)

为什么不使用 @Input@Output 来检测从父组件到子组件的更改? 我建议您使用 @Input (parent => child) 并使用 @Output (child=> parent) 而不是 detectChanges()