1

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

这个问题在很大程度上延续了我之前的问题。我使用“异步计算”方法来刷新页面的某些部分。感谢 Michael Best,我解决了 UI 不可见部分的更新问题。但是还有一件烦人的事情。如何将初始(默认)值设置为计算的 observable?我尽量避免在页面加载期间多次调用 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更改,因为方法淘汰赛用于重新评估计算的 observables。来自类似问题的建议有效,因为它会检查之后 var value = self.product() * self.quantity();的第一次评估。所以计算总是跟踪productquantity。我不能使用这种方法,因为我不能evaluator仅仅为了关心依赖而打电话,因为evaluator可以进行 ajax 调用......

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

4

1 回答 1

2

您可以使用deferEvaluation选项:

    var c1 = ko.computed({
        read: function() {
            // computations
            return "some value";
        },
        deferEvaluation: true
    });

您可以使用计算上下文来确定初始计算(同一文档)。

更新

您可以使用 "isInitial" 来确定是否第一次计算计算:

var myComputed = ko.computed(function() {
    var isFirstEvaluation = ko.computedContext.isInitial();
    if(isFirstEvaluation) {
        // some code
    }
    else {
        // some code
    }
});
于 2016-04-19T08:27:57.003 回答