7

当输入字段模糊时,我想向服务器提交一些数据。用户还应该能够通过按 Enter 来模糊输入字段。

不幸的是,这会导致以下结果:$rootScope:inprog: $apply already in progress error

Plunkr - 在此先感谢!

4

3 回答 3

10

这是正在发生的事情:

  • 你按回车
  • ng-keydown 触发器(摘要开始)
  • 你打电话target.blur()
  • ng-blur 触发并尝试开始另一个摘要循环
  • 角抱怨

模糊同步执行并立即触发处理程序,而无需完成第一个摘要。

在我看来,这不是您的代码的问题,而是一个 Angular 错误。我一直在想一个更好的解决方案,但我只能找到:

app.controller('BlurCtrl', function($scope, $timeout) {
  $scope.blurModel = "I'm the value"

    $scope.blurOnEnter = function( $event ) {
      if ( $event.keyCode != 13 )
        return

      // this will finish the current digest before triggering the blur
      $timeout(function () { $event.target.blur() }, 0, false);
    }

    $scope.onBlur = function() {
    $scope.result = this.blurModel
    }
})
于 2013-08-22T20:17:15.987 回答
4

您可以签出 Angular UI @ http://angular-ui.github.io/ui-utils/

提供细节事件句柄相关的 blur,focus,keydow,keyup,keypress

<input ui-event="{ blur : 'blurCallback()' }">
<textarea ui-keypress="{13:'keypressCallback($event)'}"></textarea>
<textarea ui-keydown="{'enter alt-space':'keypressCallback($event)'}"> </textarea>
<textarea ui-keydown="{27:'keydownCallback($event)'}"></textarea>
<textarea ui-keydown="{'enter alt-space':'keypressCallback($event)'}"> </textarea>
<textarea ui-keyup="{'enter':'keypressCallback($event)'}"> </textarea>
于 2013-08-23T07:29:42.097 回答
1

这是一个小指令:

    .directive('ngEnterBlur', function () {
    return function (scope, element, attrs) {
        element.bind("keydown keypress blur", function (event) {
            if(event.which === 13 || event.type === "blur") {
                scope.$apply(function (){
                    scope.$eval(attrs.ngEnterBlur);
                });

                event.preventDefault();
            }
        });
    };
})
于 2015-08-25T01:01:49.857 回答