2011-12-13 13 views
0

私は彼らのサンプルでknockoutjsで遊んでいます。私は下にある元のコードを編集しました。依存関係が変更されている場合にのみ、fullNameメソッドが機能するように、fullNameメソッド内の依存関係を確実に知ることができます。ko.dependentObservableこのメソッドが依存関係を巧みに理解する方法を教えてください。

fullNameメソッドからthis.LastName()を削除すると、lastNameプロパティを変更してもfullNameメソッドが呼び出されません。

どうしたのでしょうか。

var viewModel = { 
    firstName: ko.observable("Bert"), 
    lastName: ko.observable("Bertington") 
}; 

viewModel.fullName = ko.dependentObservable(function() { 
    alert('worked'); 
    return this.firstName() + " "+ this.lastName() ; 
}, viewModel); 


// Activates knockout.js 
ko.applyBindings(viewModel); 

答えて

4

dependentObservablesの評価中に使用されるKnockoutに依存性追跡メカニズムがあります。重要なことは、オブザーバブルにアクセスするには関数を経由する必要があるということです(this.firstName()と呼ぶ必要があります)。ファーストネームを返すとともに、ノックアウトは従業員としてdependentObservableをfirstNameに追加します。 firstNameが更新されると(機能を再度通過する必要がある)、すべての加入者に通知されます。

また、これらの依存関係は、dependentObservableが評価されるたびに再評価されるため、依存関係はdependentObservableに対して実際に変更される可能性があります。

+0

すべての依存関係が評価されるわけではないので、この動作は非常に危険です。 "return @ dependent1()|| @ dependent2()"のように評価される計算されたブール値のプロパティを考えてみましょう。最初の評価で@ dependent1()がtrueの場合、KOは計算されたプロパティも@ dependent2の変更を追跡する必要があることを知ることができません。私の意見では依存関係を設定する別のより明確な方法があるはずです。 – rosenfeld

+1

@rosenfeld - あなたのケースでは、 'dependent1'が変更されない限り値は決して変わらないので、必要な唯一の依存関係です。危険なシナリオは、観察できないものに分岐した場合(時刻が12時以降の場合)です。変数に 'dependent1'と' dependent2'の両方を宣言し、適切な値を返すようにすることは常にオプションです。両方とも観測可能変数として追跡されます。助けることを望む! –