10

以下のようなメッセージを送信する onkeypress イベントを含む html テキスト ボックスがあります。

<input type="text" data-bind="attr:{id: 'txtDim' +  $data.userID, onkeypress: $root.sendMsg('#txtDim' +  $data.userID, $data)}" />

以下のように入力ボタンを押しながらメッセージを送信するためのJavaScript関数を作成しました。

self.sendMsg = function (id, data) {
    $(id).keydown(function (e) {
        if (e.which == 13) {
            //method called to send message
            //self.SendDIM(data);
        }
    });
};

私の場合、メッセージを送信するにはEnterボタンを2回押す必要があります。1: keypress call self.sendMsg 2: keypress call self.SendDIM

しかし、キーを 1 回押すだけでメッセージを送信する必要があります。プレーンな JavaScript でのみ実行できます。しかし、ビューモデル データが必要なため、データ バインドに適用されます。だからうまくいきません。

4

2 に答える 2

17

Enter キーを 2 回押す必要があるのは、メソッドがハンドラーをイベントsendMsgにアタッチしているだけだからです。keydownこのハンドラーは、2 回目のボタン押下で呼び出されます。

より良い方法は、イベント ハンドラーをアタッチしてビュー モデルを渡すカスタム バインディング ハンドラーを作成することです。

ko.bindingHandlers.returnAction = {
  init: function(element, valueAccessor, allBindingsAccessor, viewModel) {

    var value = ko.utils.unwrapObservable(valueAccessor());

    $(element).keydown(function(e) {
      if (e.which === 13) {
        value(viewModel);
      }
    });
  }
};

ここで実行例を見ることができます

于 2013-01-12T11:57:24.977 に答える
6

以下のようなキープレスイベントをテキストボックスに追加しました

 <input type="text" data-bind="attr:{id: 'txtGoalsheetNote' +  $data.userID}, event:{keypress: $root.SendMsg}" />

そしてJavaScriptでは、イベントをパラメーターとして保持することにより、次のメソッドを追加しました

 self.SendMsg= function (data, event) {
    try {
        if (event.which == 13) {
            //call method here
            return false;
        }
        return true;
    }
    catch (e)
{ }
}

それからその仕事。

于 2013-01-14T12:41:31.047 に答える