3

私は KnockoutJs に取り組んでおり、テキストボックスで valueUpdate:'afterkeydown' を使用し、select 要素で valueUpdate: 'change' を使用して、それぞれの変更をサブスクライブし、同じタスクを実行しました。値が変更されるたびに、サブスクライブを介して同じ関数を呼び出したいと思います。

より明確にするために、私は以下のようなものにしています:

    <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で同じ関数を呼び出している場合、同じことをしなければならない場合、4つの値の更新を個別にサブスクライブするのではなく、単一のサブスクライブ(LOCを保存)またはそのようなものですべてのvalueUpdateをサブスクライブする方法があるかどうか疑問に思っていましたそれらのそれぞれと。前もって感謝します。:)

4

1 に答える 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 に答える