2016-04-01 36 views
2

我有乘法函數,如count()getTotal()。如果我的cart/object發生了某些變化,所有這些計算功能都必須運行。 目前我在{{count()}}之類的視圖中使用它們。因此,所有這些功能都運行乘法時間。 我認爲這些函數被稱爲乘法時間,因爲髒檢查。它是否正確?從運行乘法時間的角度避免函數表達式

現在我讀了關於$watch函數,你應該儘量避免它,因爲性能問題。無論如何,我想測試它,並$watched我的cart。我發現它只記錄一個單個時間所以不會更快到$watch我的cart並調用所有計算函數在那裏,然後只是綁定到計算的結果?

我有點困惑知道,因爲我認爲它會有相同的行爲。因爲$watch也將通過摘要循環。

我知道現在已經有很多類似的問題,但有人直接爲我的案例解釋它並不是很難,因爲它會讓問題變得簡單。

例如: 什麼有更好的表現?爲什麼?兩種變體是否都經歷了摘要循環?爲什麼然後Variant 2記錄10次而Variant 1只記錄1次?

變1個

// bind these to scope and show like {{totalGross}} 
cartService.totalGross = null; 
cartService.totalNet = null; 
cartService.totalItems = null; 
// watch the cart here and update all variables 
$rootScope.$watch(function() { 
    return cartService.cart; 
}, function(){ 
    cartService.totalGross = cartService.getCartTotalGross(); 
    cartService.totalNet = cartService.getCartTotalNet(); 
    cartService.totalItems = cartService.getTotalItems(); 
}, true); 

變2

// bind these to scope and show like {{getCartTotalGross()}} 
cartService.getCartTotalGross(); 
cartService.getCartTotalNet(); 
cartService.getTotalItems(); 

試圖回答我的問題,如果altough這是正確的我不是舒爾。

變1你有1個更多的守望者,但我們只是看值,而不是功能和更1,因爲我們與$watch手動看車。但是觀察者計算起來不那麼沉重。

變體2我們正在觀察函數返回的值,所以函數必須計算相同的值乘以倍數,女巫更重。在每個摘要循環中UI得到更新

這是正確的嗎?所以變種1對性能更好?

+0

請,張貼[MCVE(http://stackoverflow.com/help/mcve)的你想達到的目標。目前尚不清楚你的'案件'究竟是什麼。 – estus

+0

如果您提出具體問題,這將有所幫助。 –

+0

@estus更新,讓你也許更多地瞭解我想問的問題。 – user2834172

回答

3

通常認爲不好的做法是不要(僅)使用$ watch,因爲它存在性能問題,但是因爲大多數情況下都有更好的替代方法(更清晰和更高效)。

例如,當用戶在輸入中輸入某些內容時,爲了計算取決於此值的內容,您可以不使用觀察模型值,而使用ng-change對輸入進行調用並從那裏調用計算。這是更快,意圖更清晰。

現在回答你的問題:

每次事件被角處理,事件處理程序可以修改的範圍東西。 Angular無法知道已修改的內容。因此,它必須調用,例如,getTotalItems()因爲一個事件處理程序可能已經改變這是令getTotalItems()變化的返回值。

此外,更改所監視的任何值都會導致執行觀察程序功能,並且此觀察程序功能可以反過來更改其他值,其他觀察程序可以監視等。因此角度需要評估所有觀察過的表達式都在一個循環中,直到可以確定最後的評估結果與前一個結果相同。這就是所謂的摘要循環。

因此,簡而言之,在視圖中有{{ getTotalItems() }}並不是什麼大問題,如果該函數只是返回一些簡單的東西,比如數組的長度或者幾個值的總和。但是,如果計算生命的意義,這是一個非常糟糕的主意,你應該改爲計算生命的意義,只有當需要計算它,並把結果保存在顯示視圖中的變量。

你可以做到這一點與觀察者,但應該是最後的手段。正如我已經說過的那樣,通常有更好的選擇。

+0

但變種1更快?所以我應該對Variant 1或2使用15 ng變化? – user2834172

+0

速度並不是唯一重要的事情。如果變體2的速度足夠快,那就去做吧。即使出現性能問題,也不要優化。這是萬惡之源。 –

+0

但它作爲一個應用程序運行在iOS上,它很慢,速度很慢。所以我試圖找到一種方法來優化它。但似乎你只是不想說是或否;)變種2是緩慢的。變種1可能很快我仍然不知道。使用15納克 - 更改可能會更快,但更難以維護。 – user2834172