2017-01-27 5 views
1

Ich versuche, ein Feld zu bearbeiten und Etikett in Textfeld auf einen Klick auf eine Schaltfläche und ändern Sie es zurück in Etikett bei Tastendruck-Ereignis (ng-keypress).ng-show ng-ausblenden mit Controller

Ich ändere die Variable ng-show durch den Controller, aber es funktioniert nicht.

HTML:

<div ng-app> 
    <div ng-controller="showCrtl"> 
     <form> 
     <label ng-hide="editMode" >{{field}}</label> 
      <input ng-show="editMode" ng-keypress="changemode($event) " ng-model="field" > 
      <span class="pull-right" > 
      <button ng-click="editMode=true" class="btn-lg btn-warning" >edit </button>          </span>      
     </form> 

    </div> 
</div> 

JS:

function showCrtl($scope){ 
    $scope.field="Chanel"; 
    $scope.changemode=function(event){ 
    if(event.charCode==13){ 
      $scope.editMode = false; 
    } 
    } 
} 

Meine aktualisiert JS-Fiddle Link: http://jsfiddle.net/8Yz7S/281/

Antwort

3

Verwendung ng-Unschärfe statt ng-keypress,

<input ng-show="editMode" ng-blur="changemode() " > 

DEMO

EDIT:

die folgende Anweisung an das Schlüsselereignis behandeln geben,

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

     event.preventDefault(); 
     } 
    }); 
    }; 
}); 

DEMO

+0

Dann wird es zu beschriften, sobald ich mit der Eingabe beginnen. – Rachel

+0

versuche mit ng-blur – Sajeetharan

+0

Ich möchte das Feld bearbeiten und dann wehn ich drücke Enter es sollte zurück zu Etikett wechseln – Rachel

0

Sie wollen aus der Sicht so viel Logik wie möglich verschleiern. So wie er vorgeschlagen, verwenden

<input ng-show="editMode" ng-keypress="changemode($event)"> 

Dann tun Sie alle Ihre Logik innerhalb des Change() Funktion:

$scope.changemode = function(evt) { 
    $timeout(function() {$scope.editMode = false;},100); 
} 

http://jsfiddle.net/8Yz7S/293/

+0

Hallo Josh, ich habe versucht: http://jsfiddle.net/8Yz7S/279/ es funktioniert nicht – Rachel

+0

Sie müssen möglicherweise eine Zeitüberschreitung verwenden, um den Digest-Zyklus zu erzwingen: http://jsfiddle.net/8Yz7S/293/ – Josh

1

Können Sie versuchen, die unten Lösung.

<input ng-show="editMode" ng-keypress="changemode($event) " > 

hinzugefügt Intervall die Ansicht zu aktualisieren

function showCrtl($scope, $timeout){ 

    $scope.changemode=function(event){ 
    if(event.charCode==13){ 

    $timeout(function() { 
    $scope.editMode = false; 
    }, 500); 
    } 
    } 
    } 

http://jsfiddle.net/gsjsfiddle/hcu5mkhm/3/

+0

Es läuft ab und ändert sich in label, aber das Feld wird nicht aktualisiert. – Rachel

+1

Nach dem Klicken auf die Schaltfläche "Enter" wurde die Ansicht auf "Channel and edit" (Schaltfläche) geändert. Aber ich habe dein Problem nicht klar verstanden? Welches Feld erwarten Sie, aktualisiert zu werden? – GrabNewTech

+0

Ich habe meine Geige aktualisiert, um es klarer zu machen: http://jsfiddle.net/8Yz7S/281/ – Rachel

1

Der Grund, es ist nicht für Sie arbeiten, ist, dass Sie das Standardverhalten von Enter Schlüssel nicht verhindern. Nach changemode wird die Funktion ausgeführt und editmode wird auf false gesetzt, klicken Sie auf Ereignis der Schaltfläche Bearbeiten wird auch ausgeführt, Einstellung editmode zurück zu true.

Alles, was Sie tun müssen, ist Aufruf event.preventDefault(); wie unten dargestellt:

function showCrtl($scope){ 
    $scope.field="Chanel"; 
    $scope.changemode=function(event){ 
    if(event.charCode==13){ 
     $scope.editMode = false; 
     event.preventDefault(); // <<<<<<< 
    } 
    } 
} 

Um dieses Verhalten zu überprüfen, können Sie diese Geige überprüfen: http://jsfiddle.net/vnathalye/8Yz7S/301/

Probieren Sie es aus, nachdem die Linie event.preventDefault(); Kommentierung und die Konsole überprüfen.

+0

Vielen Dank für die Erklärung – Rachel

Verwandte Themen