2013-08-22 3 views
7

Я хочу отправить некоторые данные на сервер, когда поле ввода размыто. Пользователь также должен иметь возможность размыть поле ввода, нажав enter.AngularJS submit on blur and blur on keypress

К сожалению, это приводит к следующему: $rootScope:inprog: $apply already in progress error.

Plunkr - заблаговременно!

ответ

10

Вот что происходит:

  • Нажимаешь введите
  • нг-KeyDown триггерами (дайджест начинается)
  • Вы называете target.blur()
  • нг-смазанности спусковые и пытается начать новый цикл дайджеста
  • Угловые жалобы

Размытие выполняется синхронно и сразу же запускает обработчик, не заканчивая первый дайджест.

На мой взгляд, это не проблема с вашим кодом, а скорее угловая ошибка. Я пытался придумать лучшего решения, но я могу только найти:

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 
    } 
}) 
+0

Благодарим вас за это. Я видел это только на Safari mobile. – JimTheDev

+0

У меня была эта проблема в Chrome. При нажатии кнопки я хотел вызвать blur() для элемента ввода. Добавление myInput.blur() в тайм-аут исправило мою проблему! –

+0

Спасибо, человек! Работает как шарм. – Siyah

4

Вы можете оформить Угловое UI @http://angular-ui.github.io/ui-utils/

Обеспечить детали события, связанные обрабатывать размытости, фокуса, keydow, KeyUp, нажатие клавиши

<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> 
+0

У меня возникла проблема с двойным стрельбой ng-blur. Переключение на ui-событие для размытия мгновенно решило мою проблему и избавило меня от головной боли. Спасибо! –

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(); 
      } 
     }); 
    }; 
})