由於角2擁抱單向數據流範例,我會爭辯說,解決此問題的「最」'角''方法是根據而不是調用update()
方法。兒童組件的狀態應由父母提供。
無論何時發生點擊,應該在App
(父級)組件中計算新狀態,並將傳遞到ChildComponent
。
走出這種方式,您將需要一個附加屬性,以便擴展父舉行的狀態(例如clicked
):
rowList = [{name: "Alice", clicked: false}, ...];
(當然,因爲undefined
具有相同的邏輯值作爲false
,顯式聲明並不是真的有必要。)
單擊,在處理程序方法中,計算新狀態。在這種情況下,它只是一個簡單的布爾值的變化:
processClick(id){
this.recentClick = id;
// Create the new array for immutability benefits.
this.rowList = this.rowList.map(person => {
if (person.name === id) {
return {name: person.name, clicked: true};
} else {
return person;
}
})
}
值傳遞到孩子,因爲任何其他@Input
。現在
<my-child *ngFor="let row of rowList;" [id]=row.name [clicked]=row.clicked (onMD)="processClick($event)"></my-child>
,子組件可以改變它取決於clicked
屬性的值行爲。作爲獎勵,當使用不可變數據時,您可以將更改檢測策略更改爲onPush
,some performance benefits。
@Component({
// ...
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChildComponent {
@Input() clicked: boolean;
get prefix() {
return this.clicked ? "Bye!" : "Hi";
}
// ...
}
這種方法有很多好處。
- 潛在的子組件中沒有隱藏狀態。父母的「單詞」是絕對的(所謂的「單一的真相源」)。
- 父母並不真正需要知道或關心孩子用數據做什麼或需要何時更新。
- 您可以輕鬆地將數據提取到其他位置,而且您不需要編寫任何代碼就可以使
update()
行爲有效。
全面實施應該是這樣的:http://plnkr.co/edit/IP8iLKxKGCjHOdgPHJ0h?p=preview
,我想我不明白你想做的事,爲什麼不直接調用'更新()'方法事件時發出的? –
你說得對,在我的例子中這將是明智的,但我的實際應用程序更復雜。我試圖簡化,也許花了太多時間 - 我需要父母存儲對發射該事件的孩子的引用。父母然後去做一些其他的事情,最後基於另一個觸發器回電給孩子。我真的只需要一種方法來讓發送事件的孩子掛鉤,以便以後可以回調。對不起,我可能沒有把這個問題和我可能有的一樣說出來。 – popClingwrap
好吧,現在我明白了,所以我認爲JB Nizet的答案就是你要找的。 –