7

シンプルなチャットアプリでテキストエリアを使用しています。ユーザーがシフト+リターンを押したときにのみキャリッジリターンを有効にし、ユーザーがリターンキーだけを押したときにフォームを送信したいと思います。

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

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 = ""

      }
    }
  }
}

何が欠けているのかわからない...助けてくれてありがとう!

4

2 に答える 2

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();
        }
      });
    }
  }
});
于 2013-08-13T18:54:48.090 に答える
0

ng-keyup を使用して、ディレクティブなしで実行できます。

<textarea ng-keyup="$event.keyCode === 13 && (!$event.shiftKey) && TARGET_FUNCTION()"></textarea>
于 2016-09-01T21:28:34.560 に答える