2016-10-28 9 views
4

私は多くの計算された関数で使われている特定のノックアウト観測値を持っています。しかし、これらの計算された関数のうちの1つでは、観測値が更新されたときにトリガーするのは望ましくありません。計算されたオブザーバブルを更新するには?

self.obs1 = ko.observable(foo); 
    self.obs2 = ko.observable(bar); 

    //I want this computed to behave normally 
    this.comp1 = ko.computed(function() { 
    return self.obs1() + self.obs2(); 
    }, this); 

    //I want this computed to trigger on obs1 update but ignore updates to obs2 
    this.comp2 = ko.computed(function() { 
    return self.obs1() + self.obs2(); 
    }, self); 

    setTimeout(function() { 
    self.obs1(20); 
    self.obs2(15);  
    }, 1000); 

https://jsfiddle.net/r73yLk5u/

私はまだCOMP2が実行されたとき、私はちょうどにobs2の更新をしたいいけないobs2の現在の値にアクセスできるようにする必要があります。注:コード賢明それは次のようになりますcomp2が新しい値を持つようにトリガーします。

これは可能ですか?

+0

うわ、それが可能だ場合、私は知りませんが、それはおそらく、いくつかのカスタムエクステンダーか何かです。しかし、これは何かが間違っているというサインだと思うし、先に進んでそれをやる前に、あなたはそれを欲しがっているのですが、あなたは[XY問題](http:// meta .stackexchange.com/questions/66377/what-is-the-xy-problem)。 – vlaz

+0

ありがとう@vlaz。あなたはおそらく私はちょうどその文脈であまりにも渋滞したくないと思っていたのです。私のUIはあまりリフレッシュしていませんが、私はただちに 'obs1'へのアップデートを見たいので、rateLimitを使用することはできませんが、非常に頻繁に更新される 'obs2'があります。 – Nathan

+0

2番目の観測値で '.extend({throttle:/ * some reasonable values * /})'を使ったとお考えですか? – vlaz

答えて

2

それはpeekdocs)を使用し、観測可能に更新を無視させる:

peek機能を使用すると、依存関係を作成せずに観察または観察可能な計算にアクセスできます。

更新例:

//I want this computed to trigger on obs1 update but ignore updates to obs2 
    this.comp2 = ko.computed(function() { 
    return self.obs1() + self.obs2.peek(); 
    }, self); 

https://jsfiddle.net/r73yLk5u/2/

0

私はこれを行う方法を考えました。遅れたいobservableを返すだけの新しいCalculateを作成した場合、rateLimitを打ち切らないように、observableの代わりに計算された値を使用することができます。これにより、計算された値が将来他の理由でトリガされた場合、常に最新のobs2値を使用するようになります。

self.obs2DelayComp = ko.computed(function() { 
    return self.obs2(); 
    }).extend({ rateLimit: 3001 }); 

https://jsfiddle.net/r73yLk5u/1/

関連する問題