Функция AngularJs в выражениях

Есть ли какая-то причина, по которой вы выберете одну технику над другой?

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

Сначала: Ctrl и View

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

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

Второе: Ctrl и View

 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 несколько раз в каждом цикле дайджеста (для каждого элемента в репитере), но я слышал, что этот аргумент не так сильно отличается от использования фильтра. Любые идеи?

Изменить: меня особенно интересует эффект от грязной проверки, цикла дайджеста, часовых поясов и т.д. Кроме того, сложность функции актуальна вообще (представьте себе гораздо более сложную функцию)?

Ответ 1

Не будет никакой разницы в производительности, но с точки зрения семантики и чистого разделения нет оснований использовать первый метод. То, для чего были разработаны и оптимизированы фильтры.

Сложность функции не будет отличаться от одного метода к другому, поскольку грязные проверки происходят точно так же.

Если вы изменяете значение элементов, то ваша логика для этого обязательно должна быть исключена из вашего представления, то есть второго примера.