У меня есть таблица, в которой вызывается дочерний компонент с именем модальный, модальный компонент имеет две кнопки сохранения и отмены, которые используются для встроенного редактирования. Я знаю, что мне нужно использовать «ChangeDetectorRef», но я не могу понять, как использовать событие «ngAfterViewInit» с моим кодом
ExpressionChangedAfterItHasBeenCheckedError: Выражение изменилось после того, как его проверили. Предыдущее значение: «disableEditSaveButton: false». Текущее значение: 'disableEditSaveButton: true'.
dashboard.HTML
<p-table #dt [value]="iToDoList" dataKey="id" [paginator]="true" [rowsPerPageOptions]="[10,50,100]"
[rows]="10">
<ng-template pTemplate="header">
<tr>
<th>ID</th>
<th>Comment</th>
<th>Action</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-row>
<tr>
<td>{{row.id}}</td>
<td>
<div *ngIf="!row.isEditable">{{row.comment}}</div>
<div *ngIf="row.isEditable">
<input type="text" [(ngModel)]="row.comment">
<span *ngIf="isEmpty(row.comment)" style="color:crimson">Required</span>
</div>
</td>
<td>
<div>
<modal [disableEditSaveButton]='disableSaveButton' (open)="onOpen(row)" [showModal]="!row.isEditable" (selectedRow)="onSelectedRow(row)" (cancelEdit)="onCancelEdit(row)"></modal>
</div>
<!--<button (click)="editRow(row)">Edit</button>-->
</td>
<td> <button (click)="save(row)">Save</button></td>
</tr>
</ng-template>
</p-table>
dashboard.compnent (это вызывает ExpressionChangedAfterItHasBeenCheckedError)
isEmpty(input) {
if (input.replace(/\s/g, '') === "") {
this.disableSaveButton = true;
}
else {
this.disableSaveButton = false;
}
// this.cdr.detectChanges();
return input.replace(/\s/g, '') === "";
}
modal.html
<div *ngIf='!showModal'>
<button type="button" class="btn-xs btn-primary" (click)="onSave()" [disabled]='disableEditSaveButton'>Save</button>
<button type="button" class="btn-xs btn-orange" (click)="onCancelEdit()">Cancel</button>
</div>
modal.component
@Input() disableEditSaveButton: boolean = false;
******************ОБНОВЛЕНИЕ******************************* ************************************************
браузер все еще выдает ExpressionChangedAfterItHasBeenCheckedError
Компонент
isEmpty(input) {
this.cdr.detach();
if (input.replace(/\s/g, '') === "") {
this.disableSaveButton = true;
}
else {
this.disableSaveButton = false;
}
// this.cdr.detectChanges();
// restart change detection for this view
this.cdr.reattach();
return input.replace(/\s/g, '') === "";
}
blog.angularindepth.com/…
Я видел эту статью и попытался сделать ngAfterViewInit() { this.cdr.detectChanges(); } это все еще не работает, потому что я устанавливаю дочерний ввод не в ngAfterViewInit. Не уверен, как бы я это сделал, если дочерние значения должны быть установлены в методе «isEmpty»
Я использовал setTimeout, он работал, но очень медленно... Мне нужно лучшее решение