2013-08-13 4 views
7

私は単純なチャットアプリケーションでテキストエリアを使用しています。ユーザーがshift + returnキーを押すと、キャリッジリターンを有効にして、ユーザーがリターンキーだけを押すとフォームを送信します。シフト+リターンのみでキャリッジリターンを有効にする方法

私はngKeydownディレクティブを使用しています。問題は、私がEnterキーを押すと、メッセージがOKに送られ、テキストエリアがクリアされ、その後に改行が挿入されます。これは、イベントが伝播し続ける意味...ここ

はHTMLコードです:

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

、ここでは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 = "" 

     } 
    } 
    } 
} 

私が欠けているのか分かりません... ご協力いただきありがとうございます !

+0

ブラウザは、キーコードを受信した(と、それに反応した)あなたのイベントが発生する前に。私はすでに起こっている伝播を止めると言うでしょう:)。 – mingos

答えて

5

私はこのためのカスタムディレクティブを書くことをお勧めします。それで、あなたが望むどんな要素でもそれを再利用することができます。次に、次の入力要素に移動する例を示します。この能力を持たせたい要素にenter-nextを入れてください。

.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

ありがとう、 'e.preventDefault();'は私が行方不明だったものです! – ybycode

0

は、それはNG-からkeyupを使用して行うことができ、任意の指示なし:

<textarea ng-keyup="$event.keyCode === 13 && (!$event.shiftKey) && TARGET_FUNCTION()"></textarea> 
関連する問題