3

我正在研究 KnockoutJs,我使用 valueUpdate:'afterkeydown' 和 textboxes 和 valueUpdate:'change' 和选择元素来订阅相应的更改并执行相同的任务。我想在每个值更改后通过 subscribe 调用相同的函数。

为了更清楚,我在下面的内容:

    <input type="text" data-bind="value: val1, valueUpdate: 'afterkeydown'"/>
    <input type="text" data-bind="value: val2, valueUpdate: 'afterkeydown'"/>
    <select data-bind="value: sel1, valueUpdate:'change'">
    <select data-bind="value: sel2, valueUpdate:'change'">

在 javascript 中,我订阅了这样的所有更改:

viewModel.val1.subscribe(function () {
            doSameWork();
        });
viewModel.val2.subscribe(function () {
            doSameWork();
        });
viewModel.sel1.subscribe(function () {
            doSameWork();
        });
viewModel.sel2.subscribe(function () {
            doSameWork();
        });


################################

var doSameWork = function(){  alert('some work done!');  };

如果我对每个 valueUpdate 调用相同的函数,那么我想知道是否有任何方法可以在单个订阅中订阅每个 valueUpdate(保存 LOC)或类似的东西,而不是在我必须做同样的事情时分别订阅四个值更新与他们每个人。提前致谢。:)

4

1 回答 1

1

您只能创建一个事件处理程序并将其“共享”给所有可观察对象

var ViewModel = function () {
    var self = this;

    self.onValueChanged = function (newValue) {
        // your task
        alert('some work done!');
    };

    self.val1 = ko.observable();
    self.val1.subscribe(self.onValueChanged);
    self.val2 = ko.observable();
    self.val2.subscribe(self.onValueChanged);
    self.sel1 = ko.observable();
    self.sel1.subscribe(self.onValueChanged);
    self.sel2 = ko.observable();
    self.sel2.subscribe(self.onValueChanged);

};

见小提琴

@Accssharma:

第一次计算计算时,ko 引擎检测可观察对象和计算对象之间的依赖关系。所以当你写这个时:

ko.computed(function(){ val1(); val2(); sel1(); sel2(); doSameWork(); });

Ko 将 val1、val2 sel1 和 sel2 注册为计算的依赖项。这意味着如果 val1 或 val2.. 改变了计算也可能改变。因此,当一个可观察对象(例如 val1)发生变化时,需要对计算的值进行评估。这就是调用 doSameWork 函数的原因。

我希望它有所帮助。

于 2013-08-01T08:01:41.830 回答