![](/img/trans.png)
[英]How using changeDetection: ChangeDetectionStrategy.OnPush in angular2
[英]Would you recommend ChangeDetectionStrategy.OnPush as default changeDetection in Angular 2?
在 Angular-2 項目中始終使用它是否是一個合理的約定
changeDetection: ChangeDetectionStrategy.OnPush
在組件的裝飾器中? 除非有明確的理由使用默認策略?
不,我不建議這樣做。
Angular 2 變化檢測非常快。 如果你有一個小項目,我不會費心使用它。
如果您有一個大型項目,我可能只會在某些“葉”組件上使用OnPush
—— 具有僅依賴於輸入屬性的視圖綁定的葉組件。 (“葉子”組件沒有子組件。)
請注意, OnPush
可以防止子組件被自動檢測更改,因為如果沒有導致OnPush
組件被更改檢測,則也不會檢查其子組件。 因此我通常只在葉組件上使用它的原因,以避免這個可能的問題。
還要注意,如果您對輸入屬性使用 JavaScript 引用類型, OnPush
將不會檢測您對這些引用類型的屬性所做的更改(例如,如果您從數組中添加或刪除元素,或者如果您修改對象屬性的值。 )
特別是對於大型項目,答案是YES
,並且始終建議您在創建新組件時首先添加它。
原因很簡單:為了減少變化檢測過程,這是一項非常昂貴的操作。
有很多方法可以在需要時啟動檢測,也許最常用的是從ChangeDetectorRef
手動觸發changeDetection()
。 如果您正在等待訂閱值,另一種方法是在視圖中使用async
管道。
要在終端中運行ng generate component
命令時自動添加OnPush
策略,您只需在schematics
節點的angular.json
中添加該選項:
...
"schematics": {
"@schematics/angular:component": {
"changeDetection": "OnPush",
"prefix": "app",
"styleext": "scss"
},
"@schematics/angular:directive": {
"prefix": "app"
}
}
...
您可以使用immutable.js來“凍結”所有對象並且不允許修改,如果您想全局使用 OnPush 以防止組件綁定中的錯誤,這將是一個更安全的路線
不。
為什么? 不是因為默認的變更檢測策略更好。 但是因為從它切換到 OnPush 可能會很麻煩而且影響很大。 如果您使用任何不使用 OnPush 的 3rd 方應用程序,您也可能會遇到一些問題。
我只是不明白為什么很多人都加入默認更改檢測策略的潮流並推薦它。 在我看來,angular 應該總是只有一種選擇——OnPush。 這不是什么新鮮事。 Silverlight/WPF 通過 INotifyPropertyChanged 執行此操作
public string UserName
{
get { return this.username; }
set
{
this.username = value;
// tell the UI that this UI bound property has been changed and that it is time to update the UI
PropertyChanged(this, new PropertyChangedEventArgs("UserName"));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.