Angualr2 RC4子组件属性设置器未执行

时间:2016-08-16 11:13:15

标签: angular typescript

我有一个父组件,其中包含一个子组件,用于显示地图中的一系列位置。要显示的位置将加载到父组件中。我在父模板中有这个:

<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();在谷歌地图事件列表器之外,它的工作原理。但我需要地图中的一些数据,所以我必须使用此事件

2 个答案:

答案 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();  
    });
  }