11

KnockoutJS には、計算されたオブザーバブルの概念があります。これは、1 つ以上のオブザーバブルに依存する関数です。ノックアウトは、ドキュメントで説明されているように、計算されたオブザーバブルの依存関係を判断できます。

計算されたオブザーバブルを宣言すると、KO はすぐにその評価関数を呼び出して初期値を取得します。エバリュエーター関数が実行されている間、KO は、エバリュエーターが値を読み取るオブザーバブル (または計算されたオブザーバブル) のログを保持します。

さて、私が理解していないのは、計算されたオブザーバブルに条件付きロジックが含まれている場合、これがどのように機能するかです。Knockout がエバリュエーター関数を呼び出す場合、確かに条件付きロジックにより、関数が呼び出されないことに依存するオブザーバブルが発生する可能性がありますか?

テストするためにこのフィドルを作成しました:

http://jsfiddle.net/bJK98/

var ViewModel = function(first, last) {
    this.firstName = ko.observable(first);
    this.lastName = ko.observable(last);
    this.condition = ko.observable(false);

    // at the point of evaluation of this computed observabled, 'condition'
    // will be false, yet the dependecy to both firstName and lastName is
    // identified
    this.fullName = ko.computed(function() {
        return this.condition() ? this.firstName() : this.lastName();
    }, this);
};

firstNameしかし、どういうわけか、Knockout は と の両方への依存関係を正しく識別しましたlastName

誰でも方法を説明できますか?

4

2 に答える 2

13

依存関係は、dependentObservableが再評価されるたびに再度追跡されます。したがって、条件付きロジックがある場合、ヒットしないブランチは依存関係に寄与しません。

フィドルで、を編集するfirstNameと、を切り替えるまで値は更新されませんcondition。その時点で、lastNameは依存関係ではなくなったため、これを変更しても、dependentObservableはトリガーされません。

元の説明よりも実際には複雑ではありません。覚えておくべき基本的なことは、依存関係は再評価されるたびに記録されるということです。

于 2012-04-13T19:56:12.463 に答える