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随时更新
问题是,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)
这是一个小提琴,展示了这种方法
小智 8
有一种方法可以强制重新计算所有可观察量,具体取决于您的:
getCurrentValues.valueHasMutated()
Run Code Online (Sandbox Code Playgroud)