1

【無理そうです。この質問には後で自分で答えます]

この質問は、主に以前の質問の続きです。「非同期計算」アプローチを使用して、ページの一部を更新します。Michael Best のおかげで、UI の見えない部分の更新に関する問題を解決できました。しかし、まだ厄介なことが 1 つあります。初期 (デフォルト) 値を計算されたオブザーバブルに設定するにはどうすればよいですか? ページの読み込み中に複数の 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ため、変更をサブスクライブすることはありません。の後の最初の評価をチェックするため、同様の質問からの提案が機能します。したがって、計算された は常に追跡され、. ajax呼び出しを行うことができるように、依存関係を気にするためだけに呼び出すことができないため、このアプローチは使用できません... var value = self.product() * self.quantity();productquantityevaluatorevaluator

計算済み (または純粋な計算済み) の最初の評価を抑制する方法はありますか? それとも初期値を設定する方法ですか? 助言がありますか?他の回避策はありますか?

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 に答える