2014-02-28 205 views
12

是否有任何理由選擇一種技術而不是另一種技術?AngularJs函數的表達式

var items = [{val:7},{val:3},{val:4},{val:1}]; 

第一:Ctrl鍵並查看

$scope.doSomething = function(val){ 
    return val + 10; 
}; 

<div ng-repeat="item in items"> 
    {{ doSomething(item.val) }} 
</div> 

二:Ctrl鍵並查看

angular.forEach(items,function(item){ 
     item.val = item.val + 10; 
     //item.valAlso = item.val + 10; Or in case you want to preserve model 
}); 

<div ng-repeat="item in items"> 
    {{ item.val }} 
</div> 

我平時比較喜歡第二個技術(例如HTTP請求後),但我想知道如果和爲什麼特別是一個優於另一個。我知道第一種技術可能最終會在每個摘要週期(對於中繼器中的每個項目)調用$ scope.doSomething多次,但是我聽說這個論點與使用過濾器沒有多大區別。有任何想法嗎?

編輯:我特別想知道對髒檢查,摘要循環,範圍監視等等的影響。還有就是函數複雜性(想象一個更復雜的函數)?

+0

@Chandermani你能否詳細說明你的答案? – TheBigC

+0

我不好意思我在想別的東西:(Nevermind – Chandermani

回答

6

兩者在性能上沒有差別,但在語義和乾淨分離方面,沒有理由使用第一種方法。這就是過濾器的設計和優化。

由於髒檢查以完全相同的方式發生,函數的複雜性在一種方法與另一種方法之間沒有差異。

如果您正在修改項目的值,那麼您的邏輯應該絕對不在您的視圖中,即第二個示例。

+4

如果你在函數doSomething中放置了一個console.log,它可以針對每個列表項被調用多次,然而forEach循環只運行一次(在實例化或服務器上請求)這些技術沒有什麼根本區別嗎 – TheBigC

+0

這兩種技術都有自己的位置,重要的是爲什麼價值正在發生變化,如果觀點是說「如果你還有10個土豆,你會......」 ,爲了顯示目的而調整控制器或模型中的當前土豆數量是錯誤的,因爲這會使得數值不正確。創建稱爲未來土豆的新屬性可能是好的或者在顯示點調整值,但是,如果在後端收到的值需要調整以正確反映其含義,則應該在那裏進行調整,而不是在視圖中進行調整。 – Nick