我有一个父组件(CategoryComponent),,一个子组件(videoListComponent)和一个ApiService。
我已经很好地完成了大部分工作,即每个组件都可以访问json api,并通过可观察对象获取相关数据。
目前视频列表组件只获取所有视频,我想将其过滤为特定类别的视频,我通过@Input()
将categoryId传递给孩子来实现这一点。
CategoryComponent.html
<video-list *ngIf="category" [categoryId]="category.id"></video-list>
这是有效的,当父CategoryComponent类别改变时,categoryId值通过@Input()
传递,但我需要在VideoListComponent中检测到这一点,并通过APIService重新请求视频数组(使用新的categoryId)。
在AngularJS中,我会对变量执行一次$watch
。处理这个问题的最好方法是什么?
发布于 2017-06-22 04:53:36
实际上,当angular2+中的子组件中的输入发生变化时,可以通过两种方式进行检测和操作:
中所述
@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
演示示例:查看this plunker
private _categoryId: string;
@Input() set categoryId(value: string) {
this._categoryId = value;
this.doSomething(this._categoryId);
}
get categoryId(): string {
return this._categoryId;
}
文档链接:查看here。
演示示例:查看this plunker。
您应该使用哪种方法?
如果您的组件有多个输入,那么,如果您使用ngOnChanges(),您将在ngOnChanges()中一次获得所有输入的所有更改。使用这种方法,您还可以比较已更改的输入的当前值和以前的值,并采取相应的操作。
但是,如果您想在只有一个特定的输入更改时执行某些操作(而不关心其他输入),那么使用输入属性设置器可能会更简单。但是,这种方法没有提供一种内置的方法来比较更改后的输入的以前和当前值(使用ngOnChanges生命周期方法可以很容易地做到这一点)。
EDIT 2017-07-25:在某些情况下,角度变化检测可能仍不会触发
通常,只要父组件更改了它传递给子组件的数据,只要数据是JS原始数据类型(字符串、数字、布尔值),就会触发对setter和ngOnChanges的更改检测。但是,在以下情况下,它将不会触发,您必须采取额外的操作才能使其工作。
发布于 2016-07-25 23:31:56
发布于 2016-10-07 03:47:44
在函数签名中使用SimpleChanges
类型时,我在控制台、编译器和集成开发环境中遇到错误。为防止出现错误,请在签名中使用any
关键字。
ngOnChanges(changes: any) {
console.log(changes.myInput.currentValue);
}
编辑:
正如Jon在下面指出的,在使用括号表示法而不是点表示法时,可以使用SimpleChanges
签名。
ngOnChanges(changes: SimpleChanges) {
console.log(changes['myInput'].currentValue);
}
https://stackoverflow.com/questions/38571812
复制相似问题