AngularJS指令在范围更改时进行计算

时间:2014-12-03 22:39:02

标签: angularjs angularjs-directive angularjs-scope angularjs-ng-repeat

我有一个ngRepeat指令,根据过滤器的输出进行计数。这是按预期运行,除非我更改动态过滤器的值。当我更改过滤器值时,ngRepeat会正确过滤,但计数不会随时更新。他们有时但不是每次都这样做。如何确保每次更新值?

ngRepeat

<li class="list-group-item" data-ng-repeat="e1 in events | availFilter:filterBy | unique:team" ng-init="teamCount = (events | availFilter:filterBy | filter:{team:e1.team})">
<div class="list-group-item-header" data-ng-click="headerClick($event)" >
    <span class="title">{{ e1.team }}</span>
    <span class="badge">{{ teamCount.length }}</span>'
</div>

控制更改过滤器

<li role="presentation" data-ng-class="{ active: activeTab('today') }">
  <a data-ng-click="filterBy = 'today';">Today</a>
</li>
<li role="presentation" data-ng-class="{ active: activeTab('before8') }"><a data-ng-click="filterBy = 'before8';">Before 8am</a></li>
<li role="presentation" data-ng-class="{ active: activeTab('after5') }"><a data-ng-click="filterBy = 'after5';">After 5pm</a></li>

过滤

availApp.filter('availFilter', function () {  
  return function (collection, term) {
      var outCollection = [];

            switch(term){
                case 'today':
                    outCollection = collection;
                    break;
                case 'before8':
                    angular.forEach(collection, function(item){
                        if(item.start.getHours() < 8)
                            outCollection.push(item);
                    });
                    break;
                case 'after5':
                    angular.forEach(collection, function(item){
                        var hr = item.end.getHours();
                        var min = item.end.getMinutes();
                        if(hr > 17 || (hr == 17 && min > 0))
                            outCollection.push(item);
                    });
                    break;
                default:
                    break;
            }

            return outCollection;
  };
});

1 个答案:

答案 0 :(得分:0)

Angular不知道你的过滤器逻辑何时发生变化,这是这里的根本问题。

它更新的时间将是由于重新计算过滤器的其他一些摘要操作。我拥有的最佳解决方案是不在过滤器中执行这种逻辑,而是将其作为角度IS意识到的范围变量公开。例如。你有一个列表,你创建这个列表的一个子集作为范围变量,并随着事情的变化更新。