强制运行计算属性函数

Geo*_*uer 78 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;
});
Run Code Online (Sandbox Code Playgroud)

假设getCurrentValues()可以返回在代码中其他位置修改的不同可观察对象集(并且来自比observableArray更复杂的结构).

我需要checkedValueCount随时更新

  • 其中一个依赖项发生了变化
  • getCurrentValues()返回一组不同的observable.

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

我正在寻找的是一种强制checkedValueCount重新运行的方法.我可以使用的东西像:

changeCurrentValues();
vm.checkeValueCount.recalculate();
Run Code Online (Sandbox Code Playgroud)

最简单的说,鉴于我有

a = ko.computed(function() { return Math.random() })
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*osh 115

我意识到我的第一个答案错过了你的观点,并不能解决你的问题.

问题是计算机只会重新评估是否存在一些迫使其重新评估的可观察量.没有本地方法强制计算机重新评估.

但是,您可以通过创建虚拟可观察值然后告知其订阅者已更改来解决这个问题.

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

}());?
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴,展示了这种方法

  • 您对 notifySubscribers() 的使用很好。比我正在做的构建一个随机数并将其设置为 dummy() 的值要好 (2认同)

小智 8

一种方法可以强制重新计算所有可观察量,具体取决于您的:

getCurrentValues.valueHasMutated()
Run Code Online (Sandbox Code Playgroud)

  • 计算机没有这种方法 (8认同)
  • 尽管如此,它仍然可以作为读者的选择,但是也许有人可以更新已接受的答案,以便注意这个函数可以与notifySubscribers()互换,以及是否有任何惩罚或优势. (2认同)