【发布时间】:2015-05-03 14:52:02
【问题描述】:
我正在尝试对 ng-repeat 指令中的一些元素进行排序。
我创建了一个自定义过滤器,尽管我收到错误消息,但它似乎可以工作:
“错误:[$rootScope:infdig] 达到 10 个 $digest() 迭代。正在中止!”
从我读到的其他答案来看,这通常是由于每个过滤器返回不同的值。我已经检查过了,我返回的是同一个数组对象……所以我不确定是什么原因造成的。
.filter('sortOffers', function() {
return function(vals, predicate, reverse) {
var vals_old = vals;
vals.sort(function(a, b) {
var sorter = reverse ? 1 : -1;
if(predicate === 'seeking') {
if(a.data.valueSought > b.data.valueSought) {
return sorter;
} else if(a.data.valueSought < b.data.valueSought) {
return -sorter;
} else {
return 0;
}
}
if(predicate === 'offering') {
if(a.data.valueOffered > b.data.valueOffered) {
return sorter;
} else if(a.data.valueOffered < b.data.valueOffered) {
return -sorter;
} else {
return 0;
}
}
});
return vals;
}
});
html:
<tr ng-repeat="offer in offers | sortOffers:sortOffersPredicate:sortOffersReverse" ng-hide="hideDueDateSellers && offer.data.offerType === 'seeking_flexibility' || hideFlexibilitySellers && offer.data.offerType === 'seeking_duedate'">
<td>{{ offer.data.valueOffered || '0' }} {{ offer.offeringString }}</td>
<td>{{ offer.data.valueSought || '0' }} {{ offer.seekingString }}</td>
<td ng-if="offer.data._owner !== currentUser._id"><button class="ui button positive" ng-click="acceptOffer(offer)">Accept Offer</button></td>
<td ng-if="offer.data._owner === currentUser._id"><button class="ui button negative" ng-click="cancelOffer(offer)">Cancel Your Offer</button></td>
</tr>
【问题讨论】:
-
您对过滤器的用途感到困惑。过滤器不能以任何方式修改数据。数据的任何修改都会导致摘要,这会导致过滤器被评估,数据被修改(再次),摘要运行(再次),没有结束。过滤器只能用于限制返回的结果,不能修改数据。在应用任何过滤器之前,应在控制器中对数据进行排序。
-
所以改变数组的顺序是什么导致了问题?
-
如果是这种情况,那么为什么要按过滤器排序? docs.angularjs.org/api/ng/filter/orderBy
-
我正在尝试研究原生 orderBy 过滤器的代码,看看他们是如何解决这个问题的……我之前没有理由深入研究它。
标签: javascript angularjs