我有一个视图模型,其中有一个可观察的数组。 我有一个计算的observable,一旦填充了可观察数组就会计算出来。我循环遍历数组的项目并计算计算的observable。
这个计算的observable在一些其他计算的observable中被引用。因此,每次引用此计算的observable时,再次进行循环。任何人都可以建议我们如何避免这种情况。这样计算的observable只执行一次循环。
答案 0 :(得分:0)
根据您声明计算的可观察量的方式(我假设典型ko.computed(evaluator)
),每次计算read
的{{1}}将执行以评估它。
考虑到你已声明" 这个计算的observable在一些其他计算的observable中被引用",这些引用中的每一个都执行evaluator
。
一般来说,你需要"缓存"你的处理结果。
防止重复处理的最简单方法是不在依赖关系链中直接使用计算。相反,在评估程序中,您可以修改viewmodel的其他一些可观察属性,并在该observable上建立依赖项。
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,
})
设置为您的viewmodel并以这种方式修改某些可观察的属性。在这种情况下,read将返回该observable。