实际上,当输入在angular2 +的子组件中发生更改时,有两种检测和处理方法:
- 您可以使用ngOnChanges()生命周期方法,如较早的答案中所述:
@Input() categoryId: string;
ngOnChanges(changes: SimpleChanges) {
this.doSomething(changes.categoryId.currentValue);
// You can also use categoryId.previousValue and
// categoryId.firstChange for comparing old and new values
}
文档链接:ngOnChanges, SimpleChanges, SimpleChange
演示示例:查看此插件
- 或者,您也可以使用输入属性设置器,如下所示:
private _categoryId: string;
@Input() set categoryId(value: string) {
this._categoryId = value;
this.doSomething(this._categoryId);
}
get categoryId(): string {
return this._categoryId;
}
文档链接:在此处查看。
演示示例:看一下这个punker。
您应该使用哪种方法?
如果您的组件具有多个输入,那么,如果您使用ngOnChanges(),则将在ngOnChanges()中一次获取所有输入的所有更改。使用这种方法,您还可以比较已更改输入的当前值和先前值,并采取相应的措施。
但是,如果您只想更改一个特定的单个输入(而不在乎其他输入)就想做某事,那么使用输入属性设置器可能会更简单。但是,这种方法没有提供一种内置的方式来比较更改后的输入的先前值和当前值(您可以使用ngOnChanges生命周期方法轻松完成此操作)。
编辑2017-07-25:在某些情况下,角度变化检测可能仍无法触发
通常,只要父组件更改传递给子代的数据,只要该数据是JS基本数据类型(字符串,数字,布尔值), setter和ngOnChanges的更改检测就会触发。但是,在以下情况下,它不会启动,您必须采取额外的措施才能使其正常工作。
如果您使用嵌套的对象或数组(而不是JS基本数据类型)将数据从父级传递到子级,则更改触发(使用setter或ngchanges)可能不会触发,正如用户回答:muetzerich中所述。有关解决方案,请点击此处。
如果要在角度上下文之外(即,在外部)对数据进行突变,则角度不会知道这些变化。您可能必须在组件中使用ChangeDetectorRef或NgZone才能使角度了解外部更改,从而触发更改检测。参考这个。