angular - ngModel 或双向绑定在 Angular 中是否需要很长时间?
问题描述
带复选框的 PrimeNG 可编辑表
子组件
<p-table id="resultTable" [columns]="cols" [value]="results" scrollable="true" [resizableColumns]="true" selectionMode="single">
...
<ng-template pTemplate="body" let-rowData let-rowIndex="rowIndex">
...
<td>
<input (click)="checkboxClicked(rowData)" pInputText type="checkbox" [(ngModel)]="rowData.active">
</td>
...
</ng-template>
...
</p-table>
@Component({
selector: 'app-child',
templateUrl: './app-child.html',
styleUrls: ['./app-child.css'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChildComponent implements OnInit {
...
checkboxClicked(book: Book) {
console.log('111:', book.active); // check the value with ngModel
this.checkboxClick.emit(book);
}
...
}
父组件
...
<app-child (checkboxClick)="checkbox($event)"></app-child>
...
@Component({
selector: 'app-parent',
templateUrl: './app-parent.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ParentComponent implements OnInit, OnDestroy {
checkboxClickSource = new Subject<Book>();
ngOnInit() {
this.checkboxClickSource.pipe(
...
).subscribe(book => {
console.log('222:', book.active); // check the value with ngModel
});
}
checkbox(book: Book) {
this.checkboxClickSource.next(book);
}
}
然后有一个问题对我来说很奇怪。首先假设 book.active 一开始是真的。
在 IE 浏览器中:输出为:111: false
222: false
在chrome浏览器中:生产模式:111: true
222: false
无生产模式:
111: true
222: true
在 IE 浏览器中,ngModel 立即生效。但是在 chrome 浏览器和生产模式下,ngModel 在值已传递给父组件时工作,但在子组件中没有更改。在 chrome 浏览器和非生产模式下,ngModel 在子组件和父组件中都不起作用。
这对我来说真的很奇怪,我无法弄清楚。有人能告诉我为什么会这样吗?
解决方案
推荐阅读
- html - 角度复选框值到打字稿
- rx-java - refCount 即使发生错误也能保持连接
- python - 当我调用 len() 时,什么是“容器”?
- mongodb - 是否可以随机检索一个项目并使用 Mongodb 对其进行修改?
- wordpress - 如何从 URL 不正确的站点中删除“加载资源失败:net::ERR_NAME_NOT_RESOLVED”
- javascript - 如何在vue中将数组从一个组件发送到另一个组件
- android - 将 URI 作为字符串存储到 SharedPreferences 会导致 Formatter 异常
- php - 在 php 中使用 CURL 使用 API
- flutter - 如何通过使用flutter bloc从fire存储中使用依赖注入来处理错误`The getter was called on null`
- python - 以特定顺序执行 if 语句中的条件