Введите ключ, используя функцию нокаута и 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);
}
});
}
};
Здесь показан пример