2016-08-16 34 views
0

我有一個父組件,其中包含一個顯示地圖中的地方數組的子組件。要顯示的位置將加載到父組件中。我有這個在我父模板:Angualr2 RC4子組件屬性setter未執行

<map-comp class="container-map" [places]="places"></map-comp> 

我加載在這個whay我的地方:

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

如果我打開我的父組件設置的地方屬性被激發的地方等於未定義。然後啓動加載數據並在父組件中設置屬性的myfunction,但父項屬性不更新。 我做錯了什麼?

UPDATE 這裏是我的plunker http://plnkr.co/edit/MROuH8znbDxTm0HKFG0Q

如果我使用self.mapConfigChanged.emit();在Google地圖事件列表工具之外。但我需要地圖上的一些數據,所以我必須使用這個事件

+0

能告訴你的子組件的模板?如果在父組件的構造函數中設置'places'數組,則子組件會正確顯示元素?子組件模板中的 –

+0

並不是關於places數組的任何內容。子組件中的placesChanged事件在子組件的谷歌地圖中加載一些標記 – cpiock

+0

不將加載位置代碼放入構造函數中不會更改。數據在執行點擊按鈕後加載顯示並隱藏父組件中的元素 – cpiock

回答

0

我的朋友@juristr解決了我的問題。非常感謝! 在更新父控件中的位置時,使用ngZone可以解決問題。

http://plnkr.co/edit/cUG1aqhQhnniD9D87rAa

private mapConfigChange() { 

    this.zone.run(() => { 
     console.log("parent event fired"); 
     this.loadPlaces(); 
    }); 
    } 
0

如果您只是修改先前使用[places]="places"通過的數組(添加/刪除),那麼將不會調用set places(...)進行此類更改。
Angular不會比較數組內容和對象屬性,它只比較對象標識。 更改數組後,您可以嘗試執行this.places = this.places.slice();,以使Angular2更改檢測更新綁定。
如果這可以解決您的問題,則可以使用observables通知更新,這些更新也會在值實際沒有更改時發出事件。

+1

沒有切片()不會改變我的問題。我將嘗試以alexandre爲例創建一個重擊者 – cpiock