当用户使用custombinding按Enter键时,首先触发可观察的订阅功能

时间:2014-06-14 15:05:43

标签: knockout.js

我的html中有以下输入字段:

<input type="text" class="form-control" data-bind="value: InputValue, returnAction: $root.columnFilter">

我有以下视图模型:

var viewmodel={
    InputValue:ko.observable(),
    getDataFromDb: function () {
       //code to get data from database
    },
    columnFilter: function () {
        viewmodel.getDataFromDb();
    }
}

$(function () {

    var beforeChangeHandler = function (value) {
        //do something
    }

    var afterChangeHandler = function (value) {
       //do something
    }

    viewmodel.InputValue.subscribe(beforeChangeGeneralFilterHandler, null, "beforeChange");
    viewmodel.InputValue.subscribe(afterChangeGeneralFilterHandler, null, "change");

    ko.applyBindings(viewmodel);
    viewmodel.getDataFromDb();

});

我正在使用以下敲除自定义绑定来输入按键:

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

在上述情况下,只要用户在输入字段中输入值并按下enter键,我就必须调用columnFilter函数。我面临的问题是,每当用户输入一个值并按下回车键时,首先调用columnFilter方法,然后用beforeChangeHandlerafterChangeHandler敲除{{1第二次执行函数会搞乱我的逻辑。

我想要的是,每当用户在输入字段中输入一个值并按下回车键时,我希望首先执行subscribebeforeChangeHandler淘汰afterChangeHandler函数,然后执行subscribe功能。

我应该对columnFilter关键自定义绑定做出哪些更改才能实现此目的?在正确更新enter时,还有其他方法可以为敲除中的输入字段实现enter键功能吗?

1 个答案:

答案 0 :(得分:1)

您可以触发此类更改,以便首先触发更改前后事件:

$(element).keydown(function (e) {
    if (e.which === 13) {
        ko.utils.triggerEvent(element, "change");
        value(viewModel);
    }
});