1

我知道淘汰赛通常只会在控件失去焦点时更新文本框绑定。我有一个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'); }
     });
});
4

3 回答 3

1

您是否尝试过 valueUpdate 绑定?更多可以找到@http: //knockoutjs.com/documentation/value-binding.html

于 2013-10-04T19:14:52.543 回答
1

您需要使用该valueUpdate选项并将其设置为afterkeydown

<input data-bind="value: someValue, valueUpdate: 'afterkeydown'" />

请参阅文档的“附加参数”部分。

于 2013-10-04T19:15:00.350 回答
1

注册返回操作绑定处理程序

如果您尝试捕获 Enter 按键,请使用捕获它的自定义绑定处理程序 -

在输入键上注册一个自定义绑定处理程序(注意,“元素”是处理程序绑定到的发送元素) -

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

为什么它与其他答案不同

如果您尝试根据输入框更新可观察对象,则其他答案没有错,但如果您尝试附加返回操作处理程序,则此答案更正确。

于 2013-10-04T19:57:57.487 回答