AngularJS自定义过滤器被调用两次

时间:2016-02-23 15:53:49

标签: javascript angularjs

我使用AngularJS创建了一个自定义过滤器,它打印出以p开头的果实。据我所知,我已正确实现了自定义过滤器。

每次调用过滤器时我都会打印出一条消息,但我很好奇为什么我的过滤器被调用了两次。

查看stackoverflow上的类似问题,我发现有一个人有类似的问题,但问题没有得到解答,并且有点不同。

JSFiddle解决方案 http://jsfiddle.net/ddemott/U3pVM/22606/

HTML代码

<body>
    <div ng-controller="ExampleCtrl" ng-app="sampleApp">
    <div class="showDiffTags" ng-repeat="val in values | myFilter:'p'">{{val.name}}</div>
    </div>
</body>

AngularJS代码

angular.module('sampleApp', []).filter('myFilter', function() {

  return function(items, firstLetter) {
    var groups = [];
    console.log("called function");
    console.log(items.length);
    for (var i = 0; i < items.length; i++) {
      if (items[i].name.substring(0, 1) == firstLetter) {
    groups.push(items[i]);
      }
    }
    return groups;
  }
}).controller('ExampleCtrl', function($scope) {
  $scope.values = [{
    name: 'apple'
  }, {
    name: 'banana'
  }, {
    name: 'orange'
  }, {
    name: 'avocado'
  }, {
    name: 'pineapple'
  }, {
    name: 'peach'
  }, {
    name: 'plum'
  }, {
    name: 'grapes'
  }, {
    name: 'mango'
  }, {
    name: 'papaya'
  }, ];
});

1 个答案:

答案 0 :(得分:1)

这是正确的行为,它与$digest循环的工作方式强烈相关

每次模型更改时,$digest至少运行两次:

  1. 模型更改后,它会运行观察者并更新模型
  2. 检查第一个$digest是否对模型进行了更改,如果是这样,另一个摘要被调用到最多10次迭代,然后是角度抛出错误。
  3. 除非你在模板和不稳定模型中有很多功能(经常更换),否则没什么可担心的。

    我用简单的按钮更新了您的小提琴,更新了范围

    的模型

    http://jsfiddle.net/U3pVM/22610/

    <button ng-click="numModel = numModel + 1">
      update model {{numModel}}
    </button>
    

    每次单击按钮过滤器运行两次时,您将看到