如何强制knockout从其绑定更新模型?

时间:2013-10-04 19:08:18

标签: javascript jquery javascript-events knockout.js

据我所知,当控件失去焦点时,敲除通常只会更新文本框绑定。我有一个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'); }
     });
});

3 个答案:

答案 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)

注册Return Action绑定处理程序

如果您尝试捕获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,则其他答案没有错,但如果您尝试附加返回操作处理程序,则此答案更为正确。