我正在开发一个应用程序,其中有一个接一个的行包含输入框。我已将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/以清楚了解我的问题
答案 0 :(得分:3)
$scope.$apply()
和ng-blur
会自动调用ng-keydown
。
出现问题的原因是您在focus
事件处理程序中以编程方式触发keydown
事件。这最终会触发先前活动元素的blur
事件,在这种情况下也会有ng-blur
。
Angular不知道blur
事件是来自用户交互还是以编程方式触发。
您可以通过推迟.focus()
执行来避免此问题,可能会注入$timeout
服务并像这样使用它:
$timeout(function () {
$this.next().focus();
}, 0);
希望这有帮助。