据我所知,当控件失去焦点时,敲除通常只会更新文本框绑定。我有一个keydown事件附加到几个文本框,模型不会更新当前焦点文本框中的值。如何在keydown事件期间强制模型使用文本框中的值更新自身?
$('.mySelector').on('keydown', function(event) {
if (event.which == 13) { // enter was pressed
event.preventDefault();
$.ajax({
type: 'POST',
url: 'pathToCall',
// model.Query still has the old text from before the keydown event since the
// text box has not lost focus yet
data: "{parameterName: " + JSON.stringify(ko.mapping.toJS(model.Query)) + "}",
function (data) {
model.SearchResults(data.d);
},
function () { alert('error'); }
});
});
答案 0 :(得分:1)
您是否尝试过valueUpdate绑定?更多信息可以在http://knockoutjs.com/documentation/value-binding.html
找到答案 1 :(得分:1)
您需要使用valueUpdate
选项并将其设置为afterkeydown
:
<input data-bind="value: someValue, valueUpdate: 'afterkeydown'" />
请参阅the docs的“其他参数”部分。
答案 2 :(得分:1)
如果您尝试捕获Enter键按下,请使用捕获它的自定义绑定处理程序 -
在回车键上注册一个自定义绑定处理程序(注意,'element'是处理程序绑定的发送元素) -
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);
}
});
}
};
然后在输入框中,给它这个数据绑定,绑定回视图模型中的函数=
<input type="text" data-bind="returnAction: goGetData" />
并在视图模型中 -
var goGetData = function () {
$.ajax({
type: 'POST',
url: 'pathToCall',
// model.Query still has the old text from before the keydown event since the
// text box has not lost focus yet
data: "{parameterName: " + JSON.stringify(ko.mapping.toJS(model.Query)) + "}",
function (data) {
model.SearchResults(data.d);
},
function () { alert('error'); }
});
};
如果您尝试根据输入框更新observable,则其他答案没有错,但如果您尝试附加返回操作处理程序,则此答案更为正确。