2015-01-05 2 views
3

Я пытаюсь сделать ng-repeat над результатом функции вызова, какУгловой JS нг-повтор - трек с помощью динамического сбора

<body ng-init='a = [1, 2, 3]'> 
    <div ng-repeat='item in f(a) track by item[0]'>{{item}}</div> 
</body> 

где f является

function f (arr) { 
    return arr.map(function (v) { 
     return [v] 
    }) 
    } 

Вот Plunker с этим кодом

Проблема в том, что в консоли мы видим ошибки, такие как 10 $digest() iterations reached. Aborting!

Это не из-за воссоздавая массива контейнеров, потому что если мы просто изменим line 3 как

return [v] -> return v 

и удалить

track by item[0] 

все работает. Это происходит из-за воссоздания предметов, и track by должен справиться с этим. Но по какой-то причине он не :(

Я также пытался решить эту проблему без track by купить положить постоянную $$hashKey по каждому пункту (даже на самой коллекции). Вот Plunker с той же ошибкой. Надеюсь, что кто-нибудь может объяснить, почему это не работает

Таким образом, есть два отдельных вопроса: случай с track by и случай с $$hashKey

BTW Да, я прочитал How to Loop through items returned by a function with ng-repeat? и AngularJS InfDig error (infinite loop) with ng-repeat function that returns array of objects более чем несколько раз, но не может найти ответ

Благодаря

+0

Я провел некоторое расследование и нашел https://groups.google.com/forum/#!topic/angular/IEIQok-YkpU где люди обсуждают мою реальную проблему, упрощенную, с которой я получаю текущий вопрос. Решения, которые у них есть, а также мой второй (с манипуляцией '$$ hashKey') работают в старых угловых и не работают в современной версии. Я думаю, что тормоз пришел в 1.1.3 -> 1.1.4, только когда 'track by' вошел в Angular – Agat

ответ

1

Есть ли какой-либо причине вы не можете вычислить результат и затем дисплей это? То есть есть ng-init="a = [0,1,2]; fa = f(a);", а затем ng-repeat="item in fa"?

Working plunkr example

Если вам нужно иметь, что вычисленный результат обновляется, когда a изменения, которые вы могли бы просто иметь $scope.$watch заявление, наблюдая за изменениями в a, а затем обновить fa.

+0

Существует множество способов, которыми я могу обойти это.Но, во-первых, они менее прямолинейны в соответствии с тем, что я пытаюсь реализовать, а во-вторых, я хочу понять, что не так с моим нынешним видением того, как он должен работать. – Agat

+0

Хорошо, думаю, я понимаю. При этом мои 2 цента состоят в том, что 'ng-repeat' часто может быть источником тяжелой неэффективности в угловом выражении, и лучше всего оставить как можно меньше логики в директиве' ng-repeat'. Вот почему я предлагаю предварительно вычислить ваши ценности, прежде чем передавать их в директиву. Не только это, вручную обновляя ваши ценности, а не позволяя угловатым «решать», когда их обновлять, вы также можете сделать вещи более эффективными и, честно говоря, более ясными относительно того, что происходит. – KhalilRavanna

+0

Речь идет не о логике, а о привязке данных: решая эту проблему с '$ watch', мы не позволяем Angular делать то, что он создал, - связывать данные без кода поддержки (в списке« track by ») – Agat

0

Ok, вот взломать мы могли бы использовать, чтобы решить дело без track by или $$hashKey

ng-repeat="item in t = angular.equals(t, f(a)) ? t : f(a)" 

Но это действительно отвечает на вопрос, почему примеры которых идет речь, не работает. Итак, пожалуйста, если вы знаете ответ - опубликуйте его - я был бы очень благодарен

Смежные вопросы