在同一输入元素上应用ng-blur和keydown(捕获输入键)显示$ apply已在进行中错误

时间:2014-07-31 07:59:16

标签: angularjs

我正在开发一个应用程序,其中有一个接一个的行包含输入框。我已将ng-blur和ng-keydown事件附加到输入框。

在ng-keydown上,我检查是否按下了一个输入然后将焦点设置到下一个输入框但是当ng-blur也附加到输入时,当我尝试将焦点设置为下一个输入时,它也会触发$ apply在控制台上已经在进行中错误,因此ng-blur上的代码无法运行。

HTML:

<div class="main" ng-app ng-controller="appCtrl">
    <input type="text" ng-repeat="name in names" ng-model="name" ng-blur="checkUpdate(name)" ng-keydown="keydownoperations(names,$event)"/>
</div>
<script src="http://code.jquery.com/jquery-2.1.1.js"></script>

JS:

function appCtrl($scope){
 $scope.names = ['John','Smith','Ravi'];

 $scope.checkUpdate = function(name){
    console.log(name);
 }

 $scope.keydownoperations = function(names,event){
     var $this = $(event.target);
     if(event.which === 13) // Enter key
     { 
            if($this.next().length) // if the adjacent sibling exists set focus
            {
                $this.next().focus();
            }
     }
   }
}

请查看此小提琴http://jsfiddle.net/jitender60/qDZa9/4/以清楚了解我的问题

1 个答案:

答案 0 :(得分:3)

$scope.$apply()ng-blur会自动调用ng-keydown

出现问题的原因是您在focus事件处理程序中以编程方式触发keydown事件。这最终会触发先前活动元素的blur事件,在这种情况下也会有ng-blur

Angular不知道blur事件是来自用户交互还是以编程方式触发。

您可以通过推迟.focus()执行来避免此问题,可能会注入$timeout服务并像这样使用它:

$timeout(function () {
  $this.next().focus();
}, 0);

希望这有帮助。