Введите ключ, используя функцию нокаута и javascript

У меня есть текстовое поле html с событием onkeypress для отправки сообщения, как показано ниже

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

Я написал функцию javascript для отправки сообщения во время preesing enter, как показано ниже:

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

В моем случае я должен нажать кнопку ввода 2 раза, чтобы отправить сообщение. 1: keypress call self.sendMsg 2: keypress call self.SendDIM

Но мне нужно отправить сообщение только на одно нажатие. Это можно сделать только на простом javascript. Но мне нужны данные viewmodel, поэтому они применяются в привязке данных. Так что не работает нормально.

Ответ 1

Я добавил событие нажатия клавиши, как показано ниже, в текстовое поле

 <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)
{ }
}

Затем его работа.

Ответ 2

Причина, по которой вам нужно нажать дважды, заключается в том, что ваш метод sendMsg привязывает только обработчик к событию keydown. Этот обработчик затем вызывается при нажатии второй кнопки.

Лучшим подходом было бы написать собственный обработчик привязки, который присоединяет обработчик события и передает модель представления с помощью:

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);
      }
    });
  }
};

Здесь показан пример