设置计算的初始值或抑制第一次评估

时间:2016-04-19 08:19:34

标签: knockout.js knockout-3.0 computed-observable

[这似乎是不可能的。我稍后会自己回答这个问题]

这个问题在很大程度上仍在继续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();之后检查第一次评估。因此,计算结果总是跟踪productquantity。我无法使用这种方法,因为我无法调用evaluator来关心依赖关系,因为evaluator可以进行ajax调用...

是否有任何方法可以抑制计算(或纯计算)的第一次评估?或者可能设置初始值? 有什么建议?其他解决方法?

1 个答案:

答案 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
    }
});