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

lp0sw83n  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(201)

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

xvw2m8pv1#

您需要使用valueUpdate选项并将其设置为afterkeydown
<input data-bind="value: someValue, valueUpdate: 'afterkeydown'" />
请参见the docs的“附加参数”部分。

vlju58qv

vlju58qv2#

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

xyhw6mcr

xyhw6mcr3#

注册Return操作绑定处理程序

如果您尝试捕获Enter键按下,请使用捕获它的自定义绑定处理程序-
在按下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'); }
     });
};

为什么与其他答案不同

如果您尝试更新基于输入框的可观察项,则其他答案都是正确的,但如果您尝试附加返回操作处理程序,则此答案更正确。

相关问题