2013-08-13 11 views
7

Używam obszaru tekstowego w zwykłej aplikacji do czatu. Chciałbym włączyć powrót karetki tylko wtedy, gdy użytkownik kliknie shift + return, i przesłać formularz, gdy użytkownik samodzielnie kliknie klawisz Return.Jak włączyć powrót karetki z przesunięciem + tylko zwróceniem

Używam dyrektywy ngKaydown. Problem polega na tym, że po naciśnięciu klawisza Enter wiadomość zostanie wysłana poprawnie, tekst zostanie wyczyszczony, a następnie zostanie wstawiony powrót karetki. Oznacza to wydarzenie utrzymuje propagować ...

Oto kod HTML:

<textarea ng-model="messageTyped" ng-keydown="checkReturn($event)"></textarea> 

i oto kod angularjs:

function chatController($scope, ChatService) { 

    $scope.messages = ChatService.messages 

    $scope.checkReturn = function(event) { 

    if (event.keyCode == 13 && !event.shiftKey) { 

     event.stopPropagation() // <------ this line seems to have no effect 

     // submit the message: 
     if ($scope.messageTyped) { 

     ChatService.SendMessage($scope.messageTyped) 
     $scope.messageTyped = "" 

     } 
    } 
    } 
} 

Nie wiem, co mi brakuje ... Dzięki za pomoc !

+0

Przeglądarka otrzymała kod dostępu (i zareagował na nią), zanim to wydarzenie został zwolniony. Powiedziałbym, że zatrzymujesz propagację, która już się odbyła :). – mingos

Odpowiedz

5

Proponuję napisać do tego niestandardową dyrektywę. Następnie możesz użyć go ponownie dla dowolnych elementów. Oto przykład użycia go do przejścia do następnego elementu wejściowego. Po prostu wpisz "enter-next" w jakimkolwiek elemencie, który chcesz mieć tę zdolność.

.directive('enterNext', function() { 
    return { 
    restrict: 'A', 
    link: function($scope,elem,attrs) { 
     elem.bind('keydown', function(e) { 
     var code = e.keyCode || e.which; 
     if ((code === 13) && (e.shiftKey)) { 
      e.preventDefault(); 
      elem.nextAll('input').first().focus(); 
     } 
     }); 
    } 
    } 
}); 
+0

Dzięki, 'e.preventDefault();' jest tym, czego mi brakowało! – ybycode

0

można to zrobić za pomocą NG-keyUp i bez dyrektywy:

<textarea ng-keyup="$event.keyCode === 13 && (!$event.shiftKey) && TARGET_FUNCTION()"></textarea> 
Powiązane problemy