2013-08-22 8 views

Odpowiedz

10

Oto co się dzieje:

  • naciśnięciu klawisza ENTER
  • NG-keyDown wyzwalaczy (strawić zaczyna)
  • zadzwonić target.blur()
  • ng rozmazaniu wyzwalacze i próbuje rozpocząć kolejny cykl digest
  • Angular narzekania

Rozmycie jest wykonywane synchronicznie i natychmiast uruchamia procedurę obsługi bez ukończenia pierwszego skrótu.

Moim zdaniem nie jest to problem z kodem, ale raczej błędem Angular. Próbowałem wymyślić lepszego rozwiązania, ale mogę tylko znaleźć:

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

Dziękuję za to. Widziałem to tylko na urządzeniu mobilnym Safari. – JimTheDev

+0

Miałem ten problem w Chrome. Po kliknięciu przycisku chciałem wywołać funkcję blur() na elemencie wejściowym. Dodanie funkcji myInput.blur() w limicie czasu rozwiązało mój problem! –

+0

Dzięki! Działa jak marzenie. – Siyah

4

Można kasy kątowa UI @http://angular-ui.github.io/ui-utils/

Podaj szczegóły zdarzenia obsługiwać związane rozmycia, ostrość, keydow, keyup, przyciśnięcie

<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

Wystąpił problem z dwukrotnym uruchomieniem ng-blur. Przejście do zdarzenia ui w celu rozmycia natychmiast rozwiązało mój problem i uratowało mi wiele bólu głowy. Dziękuję Ci! –

1

Oto mały dyrektywy:

.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(); 
      } 
     }); 
    }; 
}) 
Powiązane problemy