Parent 属性 在 child 更改其 two-way-bound 属性 后更改检测
Parent property change detection after child changes its two-way-bound property
我有一个盒子里的定制香蕉,从 parent 到 child。 parent 和 child 中的属性都以某种方式得到了很好的更新,但是我无法捕捉到 属性 在 parent 中发生变化的时刻。我需要这一刻,因为我想做点什么。我该怎么做?这是来自 parent 的一些代码:
<child
[(optionList)]="countriesList"
(optionListChange)="countriesListChanged()">
</child>
来自 child:
_optionList: Array<CustomSelectOption> = [];
@Output()
optionListChange = new EventEmitter<CustomSelectOption[]>();
@Input()
get optionList() {
return this._optionList;
}
set optionList(val) {
this._optionList = val;
this.optionListChange.emit(this._optionList);
}
所以 (optionListChange)
(child 的事件),因此,
处理程序方法 countriesListChanged()
(parent 的)永远不会被触发,尽管我正在 child 组件中更改它(它在使用 child 组件期间更改浏览器)。
试试这个,小老派
parent.html
<child
[optionList]="countriesList"
(optionListChange)="countriesListChanged($event)">
</child>
child.ts
@Output()
optionListChange = new EventEmitter<CustomSelectOption[]>();
@Input() optionList: CustomSelectOption[];
ngOnInit() {
console.log(this.optionList); // list coming from parent
}
// list changed by the child, letting know the parent
changeOptionList(val: CustomSelectOption[]) {
this.optionList = val;
this.optionListChange.emit(this.optionList);
}
parent.ts
countriesListChanged(event: CustomSelectOption[]) {
console.log('coming from child', event)
}
我不确定你是想在父级中捕获对 countriesList
的更改还是在子级中捕获对 optionList
的更改,因此我创建了一个处理这两种情况的演示。
您可以在此处查看实际效果 https://stackblitz.com/edit/angular-svbvh1
在 child.ts
中传播给父项的子项所做的更改如下
addCountry() {
this.optionList.push("child-added-country" + (this.optionList.length + 1));
this.optionListChange.emit(this.optionList);
}
来自父项的更改在 child.ts
中传播如下
ngOnChanges(changes: SimpleChanges) {
if (changes.optionList) {
this.optionListChange.emit(changes.optionList.currentValue);
}
}
他们都被parent抓到如下
countriesListChanged(list: string[]) {
console.log("countriesListChanged: ", list);
console.log("countriesList in parent: ", this.countriesList);
}
我有一个盒子里的定制香蕉,从 parent 到 child。 parent 和 child 中的属性都以某种方式得到了很好的更新,但是我无法捕捉到 属性 在 parent 中发生变化的时刻。我需要这一刻,因为我想做点什么。我该怎么做?这是来自 parent 的一些代码:
<child
[(optionList)]="countriesList"
(optionListChange)="countriesListChanged()">
</child>
来自 child:
_optionList: Array<CustomSelectOption> = [];
@Output()
optionListChange = new EventEmitter<CustomSelectOption[]>();
@Input()
get optionList() {
return this._optionList;
}
set optionList(val) {
this._optionList = val;
this.optionListChange.emit(this._optionList);
}
所以 (optionListChange)
(child 的事件),因此,
处理程序方法 countriesListChanged()
(parent 的)永远不会被触发,尽管我正在 child 组件中更改它(它在使用 child 组件期间更改浏览器)。
试试这个,小老派
parent.html
<child
[optionList]="countriesList"
(optionListChange)="countriesListChanged($event)">
</child>
child.ts
@Output()
optionListChange = new EventEmitter<CustomSelectOption[]>();
@Input() optionList: CustomSelectOption[];
ngOnInit() {
console.log(this.optionList); // list coming from parent
}
// list changed by the child, letting know the parent
changeOptionList(val: CustomSelectOption[]) {
this.optionList = val;
this.optionListChange.emit(this.optionList);
}
parent.ts
countriesListChanged(event: CustomSelectOption[]) {
console.log('coming from child', event)
}
我不确定你是想在父级中捕获对 countriesList
的更改还是在子级中捕获对 optionList
的更改,因此我创建了一个处理这两种情况的演示。
您可以在此处查看实际效果 https://stackblitz.com/edit/angular-svbvh1
在 child.ts
中传播给父项的子项所做的更改如下 addCountry() {
this.optionList.push("child-added-country" + (this.optionList.length + 1));
this.optionListChange.emit(this.optionList);
}
来自父项的更改在 child.ts
中传播如下 ngOnChanges(changes: SimpleChanges) {
if (changes.optionList) {
this.optionListChange.emit(changes.optionList.currentValue);
}
}
他们都被parent抓到如下
countriesListChanged(list: string[]) {
console.log("countriesListChanged: ", list);
console.log("countriesList in parent: ", this.countriesList);
}