为什么我的Angular函数在无限循环中被调用?

Rom*_*las 4 javascript angularjs

在我的应用程序中,我有一个input字段,如果用户输入一个特定的字符串(基本上是一个与正则表达式匹配的字符串),div则会显示一个字段.

(简化)HTML部分:

<div ng-app>
  <h2>Todo</h2>
  <div ng-controller="TodoCtrl">
      <input type="text" ng-model="searchText"/>
      <div>Hello</div>
      <div ng-show="isValid(searchText)">World !</div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

和我的控制器:

function TodoCtrl($scope) {
    var reg = /20\d{2}/g;    
    $scope.isValid = function(str) {
        console.log('Is valid?');
        return reg.test(str);
    }
}
Run Code Online (Sandbox Code Playgroud)

当用户输入一年(由正则表达式验证)时,我收到以下错误:

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["isValid(searchText); newVal: true; oldVal: false"],["isValid(searchText); newVal: false; oldVal: true"],["isValid(searchText); newVal: true; oldVal: false"],["isValid(searchText); newVal: false; oldVal: true"],["isValid(searchText); newVal: true; oldVal: false"]]
http://errors.angularjs.org/1.2.1/$rootScope/infdig?p0=10&p1=%5B%5B%22isVal…2isValid(searchText)%3B%20newVal%3A%20true%3B%20oldVal%3A%20false%22%5D%5D
    at http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:78:12
    at Scope.$digest (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:11472:19)
    at Scope.$apply (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:11682:24)
    at HTMLInputElement.listener (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:15653:13)
    at http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:2562:10
    at Array.forEach (native)
    at forEach (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:300:11)
    at HTMLInputElement.eventHandler (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:2561:5) 
Run Code Online (Sandbox Code Playgroud)

这是一个JsFiddle的链接:http://jsfiddle.net/U3pVM/6598/

我的代码有什么问题,以及如何增强它?

Kar*_*elė 7

这是g最后的结果reg.当您在相同的字符串twise上测试相同的表达式时,第二次在第一次找到的内容之后进行搜索.所以,如果你从"2001."开始,该函数将返回true,然后再次调用,搜索剩余的".".并返回false.

这是另一个答案,解释它是如何工作的.