Knockout observable订阅会多次触发

时间:2014-06-28 13:26:13

标签: javascript knockout.js

我在一个函数中有一个可观察的订阅,它重申某些事件:

ko.computed(function() {
   alert('computed fired'); 

   self.obs2.subscribe(function() {
      alert('subscribe fired');
   });

   return self.obs1();
});

我注意到当该函数运行时,订阅中的代码没有执行,但是当订阅最终触发时,其中的代码运行的次数与重复函数在触发之前运行的次数相同。

在JSfiddle中重现太复杂了,所以我选择了一个更简单但类似的例子,在computed observable中使用订阅:

http://jsfiddle.net/norbiu/7hGNb/

  1. 点击'编辑Obs2'
  2. 每次都会引发警报
  3. 点击'编辑Obs1'几次将导致第一个警报触发,而不是订阅内的警报
  4. 点击'编辑Obs2'一次将导致订阅内的警报多次运行。
  5. 有没有办法让订阅只运行一次而不必将其移到重复之外?

1 个答案:

答案 0 :(得分:2)

您将obs2评估computedsubscription

我不知道你想要在计算中的不同属性上订阅什么。我非常确定您的用例存在更合适的解决方案...

但是,一种可能的解决方法是在调用subscribe时存储返回的subscription对象,如果存在已存储的obs2,则在再次订阅self.subscription = null; ko.computed(function() { alert('computed fired'); if (self.subscription) self.subscription.dispose(); self.subscription = self.obs2.subscribe(function() { alert('subscribe fired'); }); return self.obs1(); }); 之前将其置于处理之前:

{{1}}

演示JSFiddle