我是新來的Angular2與TypeScript。我目前工作的一個項目,不幸的是,不明白什麼呢OnPush做:Strategy OnPush是什麼意思?
changeDetection:ChangeDetectionStrategy.OnPush
我尋覓了很多,但沒有找到(不明白)的正確答案。
有人可以解釋給我嗎?例子可以欣賞。
我是新來的Angular2與TypeScript。我目前工作的一個項目,不幸的是,不明白什麼呢OnPush做:Strategy OnPush是什麼意思?
changeDetection:ChangeDetectionStrategy.OnPush
我尋覓了很多,但沒有找到(不明白)的正確答案。
有人可以解釋給我嗎?例子可以欣賞。
推動變化檢測意味着只有在輸入發生變化時才運行組件的變化檢測,並且當輸入發生變化時,它們的整個對象必須發生變化。這意味着如果只有參考更改,則更改檢測將不會運行。
例如,如果你有一個組件,它是一個陣列上輸入:
@Input() testArray: Item[] = [];
如果修改父組件陣列push
,變化檢測將不會在子組件上運行。但是,如果你這樣做:
array = [...array, newItem];
<test-component [testArray]="array"></test-component>
更改檢測將運行。這用於提高應用程序性能,因爲它大大減少了更改檢測運行的次數。它通常與不可變的數據結構配對,尤其是Redux
模式與store
如@ngrx/store
。
它不是整個Object的問題,也不是整個Object的問題,而是來自'@Input()'屬性的父對象。 「這意味着如果只有參考文獻發生變化,即使您更改了」整個對象「,這也是一個參考變化。 – n00dl3
恩,謝謝。我想這是一個很好的描述。所以,我必須將它寫在孩子(期望值的組件)上,是正確的嗎? –
@SamySammour如果使用OnPush檢測,您的組件應遵循智能/愚蠢原則。這意味着諸如獲取數據,修改數據等所有事情都應該在智能組件中完成,愚蠢組件只能用於演示。這意味着您的子組件應該只有一個輸入(如上所述),並且應該按照我向您展示的方式在父組件中完成任何修改。 – Matsura
我覺得它更容易用一個例子來理解這個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'};
所以它就像角度考慮輸入元素作爲不可改變的對象,並在其內部的任何改變都將被忽略。
[Angular2中的ChangeDetectionStrategy是什麼以及何時使用OnPush Vs默認值?](https://stackoverflow.com/questions/42542639/what-is-changedetectionstrategy-in-angular2-and-when-to- use-onpush-vs-default) –