knockout.js - 强制运行计算属性函数

标签 knockout.js computed-observable

给定一个计算属性

vm.checkedValueCount = ko.computed(function(){
  var observables = getCurrentValues();  //an array of ko.observable[]
  return _.filter(observables, function(v) { return v() }).length;
});

假设 getCurrentValues() 可以返回不同的可观察值集,这些可观察值集在代码中的其他位置进行了修改(并且来自比 observableArray 更复杂的结构)。

我需要checkedValueCount随时更新

  • 其依赖项之一发生变化
  • getCurrentValues() 返回一组不同的可观察值。

问题是 ko.compulated 似乎会记住最后返回的值,并且仅在依赖项更新时更新。这处理第一种情况,但不处理后者。

我正在寻找一种强制checkedValueCount重新运行的方法。我可以使用的东西,例如:

changeCurrentValues();
vm.checkeValueCount.recalculate();

最简单地说,鉴于我有

a = ko.computed(function() { return Math.random() })

如何强制调用 a() 两次以返回不同的值。

最佳答案

我意识到我的第一个答案没有捕获你的要点,并且无法解决你的问题。

问题是,只有在存在某些可观察到的情况迫使计算对象重新评估时,计算对象才会重新评估。没有本地方法可以强制计算重新计算。

但是,您可以通过一些技巧来解决这个问题,方法是创建一个虚拟的可观察值,然后告诉其订阅者它已更改。

(function() {

    var vm = function() {
        var $this = this;

        $this.dummy = ko.observable();

        $this.curDate = ko.computed(function() {
            $this.dummy();
            return new Date();
        });

        $this.recalcCurDate = function() {
            $this.dummy.notifySubscribers();
        };        
    };

    ko.applyBindings(new vm());

}());​

Here is a Fiddle展示这种方法

关于knockout.js - 强制运行计算属性函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13769481/

相关文章:

javascript - knockout "with"绑定(bind)、级联下拉、重新加载选定值不起作用

jquery - 带有隐藏元素的 JQM 填充

javascript - Knockout 计算连接时所有页面上的评估

javascript - 为什么我的 ko computed observable 在其值更改时不更新绑定(bind)的 UI 元素?

javascript - Knockout.js:计算的可观察对象未按预期更新

javascript - 当可观察值发生更改时, knockout 绑定(bind)不会更新

javascript - 使用 OData 过滤器生成 Breeze.js 查询(多个谓词)

javascript - 尝试从单击 View 中将参数传递给 knockout 函数时出现问题

javascript - 当 foreach 具有计算的可观察量时,动画过渡 beforeRemove/afterAdd

javascript - Angular2 版本的 knockout 的 computed observable