AngularJS过滤List不调用指令

时间:2014-02-05 17:54:36

标签: angularjs angularjs-directive

如果对重复过滤的集合进行重复操作,则仅在启动和集合扩展时触发指令。如果你减少收藏,没有任何反应。

尝试

aa  -> nothing happens
then 
backspace  -> directive called

Plunkr

这是我的HTML-Fragment

<div ng-app="myApp">
    <div ng-controller="myCtrl">
       <input type="text" ng-model="q">
       <div ng-repeat="item in arr | filter:q" test>
            {{item}}<br>       
       </div>
    </div>
</div>

和我的Angular-Code

 angular.module('myApp', [])
  .controller('myCtrl', function($scope) {
    $scope.arr = ['a','aa','aaa','ab','bb'];
  })
  .directive('test', function() {
    return {
      link: function(scope, element, attr) { 
        if (scope.$first) 
          alert("Directive called");
      }
    };
  });

这是理想的行为吗? 这是一个缓存问题吗?

如何强制ng-repeat重新收集每次收集的变化?

更新

Michael的Plunkr

1 个答案:

答案 0 :(得分:1)

这是理想的行为。仅当元素由link创建时,才会调用ngRepeat函数。因此,如果列表是第一次填充,则$first在链接函数中是正确的。如果通过过滤器缩小列表,则不会重新创建其余元素,也不会调用链接函数。如果你点击后退按钮,就会创建一个新元素,现在调用该元素的链接函数。

我不太确定你想要实现什么,但我想你想在你的指令中知道元素是列表中的第一个元素。为实现此目的,我将$first设置为指令test的值:

<div ng-repeat="item in arr | filter:q" test="{{$first}}" 
          ng-class="{ active: $first || $last }">
        {{item}}<br>
</div>
你的指令中的

可以观察到这个值:

link: function(scope, element, attr) { 
    attr.$observe('test', function(newValue){
      if(newValue=='true'){
        console.log("Directive called..", newValue, scope.item);
      }
    });
  }

每次元素成为列表中的第一个元素时,控制台都会打印出来。