2017-08-22 43 views
0

我是新來的Angular2與TypeScript。我目前工作的一個項目,不幸的是,不明白什麼呢OnPush做:Strategy OnPush是什麼意思?

changeDetection:ChangeDetectionStrategy.OnPush

我尋覓了很多,但沒有找到(不明白)的正確答案。

有人可以解釋給我嗎?例子可以欣賞。

+0

[Angular2中的ChangeDetectionStrategy是什麼以及何時使用OnPush Vs默認值?](https://stackoverflow.com/questions/42542639/what-is-changedetectionstrategy-in-angular2-and-when-to- use-onpush-vs-default) –

回答

2

推動變化檢測意味着只有在輸入發生變化時才運行組件的變化檢測,並且當輸入發生變化時,它們的整個對象必須發生變化。這意味着如果只有參考更改,則更改檢測將不會運行。

例如,如果你有一個組件,它是一個陣列上輸入:

@Input() testArray: Item[] = []; 

如果修改父組件陣列push,變化檢測將不會在子組件上運行。但是,如果你這樣做:

array = [...array, newItem]; 

<test-component [testArray]="array"></test-component> 

更改檢測將運行。這用於提高應用程序性能,因爲它大大減少了更改檢測運行的次數。它通常與不可變的數據結構配對,尤其是Redux模式與store@ngrx/store

+1

它不是整個Object的問題,也不是整個Object的問題,而是來自'@Input()'屬性的父對象。 「這意味着如果只有參考文獻發生變化,即使您更改了」整個對象「,這也是一個參考變化。 – n00dl3

+0

恩,謝謝。我想這是一個很好的描述。所以,我必須將它寫在孩子(期望值的組件)上,是正確的嗎? –

+1

@SamySammour如果使用OnPush檢測,您的組件應遵循智能/愚蠢原則。這意味着諸如獲取數據,修改數據等所有事情都應該在智能組件中完成,愚蠢組件只能用於演示。這意味着您的子組件應該只有一個輸入(如上所述),並且應該按照我向您展示的方式在父組件中完成任何修改。 – Matsura

2

我覺得它更容易用一個例子來理解這個URL它與樣品有:

您有一個輸入屬性的組件:

type Person { 
    name: string; 
    surname: string; 
} 
@Component({ 
    selector: 'my-component', 
    changeDetection: ChangeDetectionStrategy.OnPush, 
    template: `<p> {{person.name}} {{person.surname}} </p>` 
}) 
class myComponent { 
    ... 
    @Input() person: Person; 
    ... 
} 

如果您用類似

person.name="changed"; 
修改該人的初始值

角度不會檢測到該更改,因爲它認爲該對象本身是相同的。您已更改對象的屬性,而不是對象本身。您需要更改整個對象(基準)進行角向檢測到這種變化:

person={name:'changed',surname:'something else'}; 

所以它就像角度考慮輸入元素作爲不可改變的對象,並在其內部的任何改變都將被忽略。