Столкнулась с проблемой в knockout.js: в текстовом нужно было отследить нажание кнопки Enter. Делов-то: привязываем к событию keypress нужный метод, и в нём уже смотрим, какая клавиша была нажата:
Но не тут-то было! После таких манипуляций текстовое поле перестало реагировать на нажатия всех клавиш, кроме enter. Помогло создание своего специализированного binding-а:
В html это отразится привязыванием на созданный байндинг нужного метода:
Спасибо stackoverflow
//html
<div>
<input type="text" data-bind="value: someValue, event : { keypress = function(data, event) { handleKeyPress(data, event) } }" />
<span data-bind="text: someValue"></span>
</div>
//view model
var ViewModel = function() {
var self = this;
self.someValue = ko.observable('');
self.handleKeyPress = function(data, event)
{
if (event.keyCode == 13)
{
//сделать что-нибудь полезное
}
}
}
ko.applyBindings(new ViewModel());
Но не тут-то было! После таких манипуляций текстовое поле перестало реагировать на нажатия всех клавиш, кроме enter. Помогло создание своего специализированного binding-а:
ko.bindingHandlers.enterKey = {
init: function(element, valueAccessor, allBindings, vm) {
ko.utils.registerEventHandler(element, "keyup", function(event) {
if (event.keyCode === 13) {
ko.utils.triggerEvent(element, "change");
//set "this" to the data and also pass it as first arg, in case function has "this" bound
valueAccessor().call(vm, vm);
}
return true;
});
}
};
В html это отразится привязыванием на созданный байндинг нужного метода:
<div>
<input type="text" data-bind="value: someValue, enterKey: doSomething } }" />
<span data-bind="text: someValue"></span>
</div>
Спасибо stackoverflow