2013-08-22 15 views

Antwort

10

Hier ist, was passiert:

  • Sie die Eingabetaste drücken
  • ng-keydown Trigger (zu verdauen beginnt)
  • Sie rufen target.blur()
  • ng-Blur-Trigger und versucht, einen anderen Digest-Zyklus
  • zu starten
  • Angular klagt

Die Unschärfe wird synchron ausgeführt und löst sofort den Handler aus, ohne den ersten Digest zu beenden.

Meiner Meinung nach ist dies kein Problem mit Ihrem Code, sondern eher ein Angular Bug. Ich habe versucht, eine bessere Lösung zu denken, aber ich kann nur finden:

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

Danke für diese. Ich habe das nur auf Safari Mobile gesehen. – JimTheDev

+0

Ich hatte dieses Problem in Chrome. Beim Klicken auf eine Schaltfläche wollte ich blur() für ein Eingabeelement aufrufen. Das Hinzufügen der myInput.blur() innerhalb eines Timeouts hat mein Problem behoben! –

+0

Danke Mann! Klappt wunderbar. – Siyah

4

Sie Angular UI Prüfung können @http://angular-ui.github.io/ui-utils/

Details Geben ereignisbezogene Unschärfe behandeln, Fokus, 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> 
+0

Ich hatte ein Problem mit ng-blur Double-fire. Der Wechsel zu ui-event für blur hat mein Problem sofort gelöst und mir viele Kopfschmerzen erspart. Vielen Dank! –

1

Hier ist eine kleine Richtlinie:

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