【问题标题】:Knockout observable subscription fires multiple timesKnockout observable 订阅多次触发
【发布时间】:2014-06-28 21:42:18
【问题描述】:

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

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. 点击“Edit Obs2”几次会导致每次触发警报
  2. 点击“Edit Obs1”几次会触发第一个警报,而不是订阅内的警报
  3. 单击“编辑 Obs2”一次将导致订阅内的警报运行多次。

有没有办法让订阅只运行一次而不必将其移到重复之外?

【问题讨论】:

  • 您的示例过于简单。为什么需要在计算的内部订阅?你想达到什么目的?因为唯一的解决方案是将订阅移到您不想做的计算之外......

标签: javascript knockout.js


【解决方案1】:

您将订阅您的obs2,就像您的computed 评估次数一样。

我不知道你想通过订阅计算中的不同属性来实现什么。我很确定您的用例存在更合适的解决方案...

然而,一种可能的解决方法是在调用subscribe 时存储返回的subscription 对象,如果已经存储了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();
});

演示JSFiddle.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2019-08-27
    • 2019-03-06
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多