2013-08-22 19 views

risposta

10

Ecco cosa sta succedendo:

  • si preme Invio
  • trigger NG-keydown (digerire inizia)
  • Si chiama target.blur()
  • trigger ng-blur e tenta di avviare un altro ciclo di digest
  • reclami angolari

La sfocatura viene eseguita in modo sincrono e attiva immediatamente il gestore senza terminare il primo riassunto.

A mio parere, questo non è un problema con il codice, ma piuttosto un bug angolare. Ho cercato di pensare a una soluzione migliore, ma posso trovare soltanto:

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

Grazie per questo. Stavo solo vedendo questo su Safari mobile. – JimTheDev

+0

Ho avuto questo problema in Chrome. Facendo clic su un pulsante, volevo chiamare blur() su un elemento di input. L'aggiunta di myInput.blur() all'interno di un timeout ha corretto il mio problema! –

+0

Grazie amico! Funziona come un fascino. – Siyah

4

è possibile verifica angolare UI @http://angular-ui.github.io/ui-utils/

forniamo i dettagli dell'evento gestire legati sfocatura, messa a fuoco, keydow, keyup, pressione di un tasto

<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

Stavo riscontrando un problema con la doppia accensione di ng-blur. Passare a ui-event per la sfocatura ha risolto istantaneamente il mio problema e mi ha risparmiato un sacco di mal di testa. Grazie! –

1

Ecco un piccolo direttiva:

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