如何在不触发计算的情况下更新计算中的observable?

时间:2016-10-28 18:23:21

标签: javascript knockout.js observable computed-observable

我有一个特殊的淘汰观察,它在许多计算函数中使用,并且它完全按照预期工作。但是,在其中一个计算函数中,我不希望它在更新observable时触发。代码方面它看起来像这样:

  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);

here

请注意,执行comp2时我仍然需要能够访问obs2的当前值我只是不想更新obs2来触发comp2有一个新值。

这可能吗?

2 个答案:

答案 0 :(得分:2)

要使其忽略对可观察对象的更新,请使用<span id="smaxResult">Some text for test</span>docs):

  

peek函数允许您在不创建依赖项的情况下访问可观察或计算的observable。

更新示例:

peek

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

答案 1 :(得分:0)

好的,所以我想出了如何做到这一点。如果你创建一个只返回你想要延迟的observable的新计算器,那么将它限制到一个它永远不会命中的点,你只需使用计算代替observable。如果将来因任何其他原因触发计算得到的话,这也会使它始终使用最新的obs2值。

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

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