【问题标题】:Knockout js computed observable executed every time it is referenced每次引用时都会执行 Knockout js 计算的 observable
【发布时间】:2014-08-11 14:41:39
【问题描述】:

我有一个视图模型,其中有一个可观察的数组。 我有一个计算的 observable,一旦填充了 observable 数组就会计算出来我循环遍历数组的项目并计算计算的 observable。

这个计算的 observable 在其他一些计算的 observable 中被引用。因此,每次引用这个计算出的 observable 时,都会再次完成循环。任何人都可以建议我们如何避免这种情况。这样计算出的 observable 只执行一次循环。

【问题讨论】:

  • 显示一些代码。否则无法猜测发生了什么。通常,除非修改了它所依赖的 observable 之一,否则不应重新计算已计算的 observable。
  • 请分享您的代码。我怀疑 rateLimit 是你要找的。​​span>

标签: knockout.js


【解决方案1】:

取决于您如何声明计算的 observable(我假设典型的 ko.computed(evaluator),然后每次计算 readevaluator 都会执行以评估它。

考虑到您已声明“此计算的 observable 在其他一些计算的 observables 中引用”,这些引用中的每一个都在执行 read

通常,您需要“缓存”处理结果。

防止重复处理的最简单方法是不在依赖链中直接使用计算。相反,在评估器中,您将修改视图模型的其他一些可观察属性并建立对该可观察对象的依赖关系。

var vm = {data: ko.observableArray(), obs: ko.observable()}
vm.modifiesModelProperty = ko.computed(function(){
  vm.obs("Some Evaluated Expression for " + vm.data())
})
vm.anotherComputed = ko.computed(function(){
  return vm.obs();
})

如果您坚持使用计算并希望将缓存封装在其中。

vm.computed = ko.computed({

  owner: (function(){
          var self = this;
          self.cachingObservable = ko.observable()

          vm.data.subscribe(function(nv){ 
              self.cachingObservable("Some Evaluated Expression for " + nv)
          });
  })(),
  read: this.cachingObservable,
})

您可以结合使用这两种方法并将owner 设置为您的视图模型并以这种方式修改一些可观察的属性。在这种情况下, read 会返回那个 observable。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2020-06-12
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 2014-10-01
    相关资源
    最近更新 更多