2012-04-13 16 views
11

KnockoutJSは、1つまたは複数の観測に依存して機能している計算観測、という概念を持って働いています。ノックアウトはdetermine the dependencies of a computed observable as described in the docsすることができます:KnockoutJS - 条件文で計算された観測を行う方法は、

あなたが計算され、観察を宣言するたびに、KOはすぐにその初期値を取得するためにその 評価関数を呼び出します。評価者の 機能が実行されている間、KOは、評価者が値を読み取る観測値(または計算済み 観測値)のログを保持します。

私が理解できないことは、計算された観測値に条件付きロジックが含まれている場合、これがどのように機能するかです。ノックアウトが評価関数を呼び出す場合、条件付き論理は、関数が呼び出されないことに依存するオブザーバブルをもたらす可能性がありますか?

私がテストにこのバイオリンを作成しました:

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

はしかし、何とかノックアウトは正しくfirstNamelastNameの両方に依存関係を特定しました。

どのように説明できますか?

+0

私は計算された観測値がすべての依存関係を評価することによって実行時に自分の状態を判断すると信じていますので、すべてが明確かつ直接的なように見えますが、申し訳ありませんが質問の要点を得ることはできません – sll

+2

私はいつもあなたが引用したようにマニュアルで説明しているアプローチはかなり賢明だと考えましたが、今これを指摘しています。それは非常にスマートで、 –

答えて

12

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

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

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

0

ノックアウト依存関係は、単一のトラッカー変数ko.dependencyDetectionによって追跡されます。

  1. したがって、計算された変数Knockoutを宣言するとすぐに、評価関数が呼び出されて初期値と依存関係が取得されます。
  2. ので、この最初の呼び出し時にそれがlastNamecondition変数の依存関係だ登録されます。
  3. 今度はlastNameが変更されると、すべての依存値が更新されます。
  4. そして、conditionが変更されると、それは評価関数を再実行し、すべての依存関係を更新します。したがって、firstNameを依存として追加し、lastNameを削除します。

これは、依存関係追跡がノックアウトでどのように機能するかを示しています。

関連する問題