[这似乎是不可能的。我稍后会自己回答这个问题]
这个问题在很大程度上仍在继续my pervious one。我使用"async computed"方法刷新页面的某些部分。感谢Michael Best I solved issue更新了UI的隐形部分。但还有一件令人讨厌的事情。如何将初始(默认)值设置为计算的可观察值?我尝试在页面加载期间避免多个ajax调用。而不是它我将json嵌入到页面中以立即加载所有内容。看似琐碎(常见)?但我无法对我的异步计算进行首次评估。所以在任何情况下都会进行ajax调用。 我可以使用这种方法:
var isFirstEval = ko.observable(true);
updateComputed = ko.pureComputed(function () {
updateTrigger();
if(isFirstEval()){
isFirstEval(false);
result(initialValue);
}
else
result(evaluator.call(owner));
});
但我面对相同的问题,就像上一个问题一样:这个计算将永远不会订阅evaluator
更改,因为approach敲除用于重新评估计算的可观察量。
来自类似问题的suggestion有效,因为它会在 var value = self.product() * self.quantity();
之后检查第一次评估。因此,计算结果总是跟踪product
和quantity
。我无法使用这种方法,因为我无法调用evaluator
来关心依赖关系,因为evaluator
可以进行ajax调用...
是否有任何方法可以抑制计算(或纯计算)的第一次评估?或者可能设置初始值? 有什么建议?其他解决方法?
答案 0 :(得分:2)
您可以使用deferEvaluation选项:
var c1 = ko.computed({
read: function() {
// computations
return "some value";
},
deferEvaluation: true
});
您可以使用计算上下文来确定初始计算(the same document)。
您可以使用" isInitial"确定是否第一次评估计算机:
var myComputed = ko.computed(function() {
var isFirstEvaluation = ko.computedContext.isInitial();
if(isFirstEvaluation) {
// some code
}
else {
// some code
}
});