更新
当看起来变更检测本身具有导致模型更改的副作用时,Angular2 会导致此错误,这通常表明导致 Angular2 应用程序工作效率低下的错误或设计缺陷。
要隐藏此类问题,您只需启用prodMode
.
生命周期方法中模型更改的解决方法调用ChangeDetectorRef.detectChanges()
以明确表明此模型更改是有意的
export class DatePicker {
constructor(private cdRef:ChangeDetectorRef) {}
@Input()
date: Date;
@Output()
dateChange = new EventEmitter();
@Input()
set type(type: string) {
if (type === "today") {
this.date = new Date();
this.dateChange(this.date);
this.cdRef.detectChanges();
}
}
}
原来的
您可以使用setTimeout()
setTimeout()
大锤方法,因为它会导致整个应用程序的更改检测周期。
@Input()
set type(type: string) {
if (type === "today") {
this.date = new Date();
setTimeout(() => this.dateChange(this.date));
}
}
这在通过变更检测更新时是必要的,type
因为 Angular2 不喜欢变更检测导致变更。
另一种方法是使用ngOnChanges()
,但这也被更改检测调用,也需要setTimeout()
解决方法
export class DatePicker implements OnChanges {
@Input()
date: Date;
@Output()
dateChange = new EventEmitter();
@Input()
set type:string;
ngOnChanges(changes:SimpleChanges) {
if(changes['type']) {
if (type === "today") {
this.date = new Date();
setTimeout(() => this.dateChange(this.date));
}
}
}
}
这两种方法之间的区别在于,第一种方法为每次更改执行代码,最后一种仅针对由绑定引起的更改。