我有一个父组件,其中包含一个子组件,用于显示地图中的一系列位置。要显示的位置将加载到父组件中。我在父模板中有这个:
<map-comp class="container-map" [places]="places"></map-comp>
我把这些地方加载到这个地方:
myservice.myfunction(myparameters).subscribe((res: Array<Place>) => {
this.places = res
});
在我的孩子组件中,我有这个属性:
@Input() set places(places: Array<Place>) {
this._places = places;
if (this._places != null) {
this.placesChanged();
}
}
如果我加载了我的父组件,则会触发set places属性,其中的位置等于undefined。然后启动myfunction加载数据并在父组件中设置属性,但不更新子父属性。 我做错了什么?
更新 这是我的傻瓜 http://plnkr.co/edit/MROuH8znbDxTm0HKFG0Q
如果我使用self.mapConfigChanged.emit();在谷歌地图事件列表器之外,它的工作原理。但我需要地图中的一些数据,所以我必须使用此事件
答案 0 :(得分:0)
如果您只是修改之前使用[places]="places"
传递的数组(添加/删除),则set places(...)
不会被调用进行此类更改。
Angular不比较数组内容和对象属性,它只比较对象标识。
更改阵列后,您可以尝试执行this.places = this.places.slice();
以使Angular2更改检测更新绑定
如果这可以解决您的问题,您可以使用observeables来通知更新,这些更新在值未实际更改时也会发出事件。
答案 1 :(得分:0)
我的朋友@juristr解决了我的问题。非常感谢! 更新父控件中的位置时使用ngZone解决了该问题。
http://plnkr.co/edit/cUG1aqhQhnniD9D87rAa
private mapConfigChange() {
this.zone.run(() => {
console.log("parent event fired");
this.loadPlaces();
});
}