2012-02-14 11 views
15

私は購読したい値が複数あるKnockoutJSのモデルクラスを持っています。各サブスクリプションはそうのように、同じタスクを実行します:KnockoutJSは同じコールバックアクションを持つ複数のオブザーバブルを購読します

function CaseAssignmentZipCode(zipCode, userId, isNew) { 
    var self = this; 
    self.zipCode = ko.observable(zipCode); 
    self.userId = ko.observable(userId); 
    self.isNew = isNew; 
    self.isUpdated = false; 

    self.zipCode.subscribe(function() { self.isUpdated = true; }); 
    self.userId.subscribe(function() { self.isUpdated = true; }); 
} 

がサブスクライブするために、これらの二つの呼び出しを結合する方法がありますが、私は「時計」の両方の値に1つのサブスクリプションを使用することができるように?

+0

:ではhttps://github.com/ZiadJ/knockoutjs-reactor – Ziad

答えて

23

計算された観測値をこの目的に使用できます。 read関数で各観測値の値にアクセスするだけで十分です。

ko.computed(function() { 
    self.zipCode(); 
    self.userId(); 
    self.isUpdated = true; 
}); 

したがって、2つの観測値に依存し、フラグを設定します。

また、「汚れた」フラグのようなものをお探しの場合は、http://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.htmlのようなものが考えられます。コンセプトは、オブジェクトのko.toJS()を呼び出す計算されたオブザーバブルを使用して、オブザーバブルのすべてをアンラップすることです。

+3

私はこの解決策を見てきました。計算が実際に何も計算していないので、理解する。 – wrschneider

+2

計算された観測値は必ずしも値を返す必要はありません。依存関係追跡メカニズムには多くの用途があります。ノックアウトは、例としてバインディングの依存関係を追跡するために計算を使用します。最近では、計算が使用できるいくつかの方法についての記事があります:http://blog.safaribooksonline.com/2014/02/19/getting-knockout-js-computed-observables/ –

+1

@RPNiemeyer - はい、絶対に作品と簡潔です。私は読みやすさに反応しています。 – wrschneider

14

ハンドラ関数の本体を複製したくないですか?それを変数に抽出します。

function CaseAssignmentZipCode(zipCode, userId, isNew) { 
    var self = this; 
    self.zipCode = ko.observable(zipCode); 
    self.userId = ko.observable(userId); 
    self.isNew = isNew; 
    self.isUpdated = false; 

    var handler = function() { self.isUpdated = true; }; 

    self.zipCode.subscribe(handler); 
    self.userId.subscribe(handler); 
} 
+0

過去、私は常に計算されたアプローチを支持してきました。しかし、私はこれを見ると、ノックアウトジュースで酔っぱらったような気分でした。今ノックアウトを使って多くのエンタープライズソリューションを構築しているので、これが私の好みのアプローチです。 – pimbrouwers

+1

計算されたアプローチを使用することの1つの利点は、スロットル用の計算でレート制限を使用できることです。 – tarrball

1

ループに追跡するために、依存関係のリストを回して、変数に関数本体をリファクタリングすると改善:

function CaseAssignmentZipCode(zipCode, userId, isNew) { 
    var self = this; 
    self.zipCode = ko.observable(zipCode); 
    self.userId = ko.observable(userId); 
    self.isNew = isNew; 
    self.isUpdated = false; 

    var handler = function() { self.isUpdated = true; }; 

    ko.utils.arrayForEach([self.zipCode, self.userId], function(obs) { 
    obs.subscribe(handler); 
    }); 
} 
2

あなたは、この目的のための拡張のいくつかの種類を作成することができます。簡単な例:

function subscribeMany(callback, observables) {  
    for (var i = 0; i < observables.length; i++) { 
     observables[i].subscribe(callback); 
    } 
} 

使用方法:以下のプラグインは考慮に値するかもしれないより精巧なソリューションをお探しの方に

var name = ko.observable(); 
var email = ko.observable(); 

var callback = function(value) { 
    console.log(value); 
}; 

subscribeMany(callback, [name, email]); 

name('test 1') 
email('test 2') 
関連する問題