【问题标题】:Same task to be done inside multiple binded KnockoutJs subscribe function在多个绑定的 KnockoutJs 订阅函数中完成相同的任务
【发布时间】:2013-08-02 00:25:01
【问题描述】:

我正在开发 KnockoutJs,我使用 valueUpdate:'afterkeydown' 和 textboxes 和 valueUpdate:'change' 和 select 元素来订阅相应的更改并执行相同的任务。我想在每个值更改后通过 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)或类似的东西,而不是在我必须时分别订阅四个值更新对他们每个人做同样的事情。提前致谢。 :)

【问题讨论】:

    标签: javascript jquery knockout.js


    【解决方案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);
    
    };
    

    See fiddle

    @Accssharma:

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

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

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

    希望对你有帮助。

    【讨论】:

    • 谢谢@Damien,我试过了,但没有成功。但是,我使用ko.computed(function(){ val1(); val2(); sel1(); sel2(); doSameWork(); }); 找到了另一个解决方案。 :)
    • 现在它可以工作了。但是解决方法可能工作它并不好。它在 val1、val2、sel1、sel2 和计算之间创建依赖关系。
    • 效果很好。您能否详细说明您的意思是什么类型的依赖项? :)。谢谢。
    • 实际上,对于这种特殊情况,依赖关系并不重要,因为必须计算出每个值更改都会触发相同的函数。而且,感谢您分享您的信息。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多