2014-02-28 171 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