2012-05-29 13 views
11

私はちょうどknockout.jsからチュートリアルを参照しています:

<!-- Folders --> 
<ul class="folders" data-bind="foreach: folders"> 
    <li data-bind="text: $data, 
        css: { selected: $data == $root.chosenFolderId() }, 
        click: $root.goToFolder"></li> 
</ul> 

、それはViewModelにはあるのです:

http://learn.knockoutjs.com/#/?tutorial=webmail

UIでマークアップがある

function WebmailViewModel() { 
    // Data 
    var self = this; 
    self.folders = ['Inbox', 'Archive', 'Sent', 'Spam']; 
    self.chosenFolderId = ko.observable(); 

    // Behaviours  
    self.goToFolder = function(folder) { self.chosenFolderId(folder); };  
}; 

ko.applyBindings(new WebmailViewModel()); 

ことができます誰でも何が$ rootなのか、なぜそれが必要なのか教えてください。私はそれを削除する場合、それは動作しません。

答えて

28

$rootは、KnockoutJS階層の上位モデル(.applyBindingsで使用するモデル)を指します。あなたの場合、WebmailViewModelオブジェクトは$rootです。

foreachを使用すると、ループ内でコンテキストが変更されるため、これは必須です。ここで発射するすべてのものは、ループ内の要素に関連付けられています。したがって、そのコンテキスト外で定義された関数/フィールドを使用するには、$rootが必要です(chosenFolderIdWebmailViewModelオブジェクトのメソッドです)。

+0

あなたの回答は私には役に立ちます+ 1 – SpringLearner

5

binding contextsページをチェックアウトする必要があります。

これはルート・コンテキストにおけるメインビュー・モデル・オブジェクト、即ち、 最上位の親コンテキストで$ルート。 $ parents [$ parents.length - 1]に相当します。

+0

私の疑問を明確にした、+ 1 – SpringLearner

0

$rootコンテキストは関係なく、常にループまたはスコープ内の他の変化の、最上位のビューモデルを指します。これにより、ViewModelを操作するための最上位のメソッドにアクセスすることができます。

例では、$dataは、 '受信トレイ'、 'アーカイブ'、 '送信済み'、 'スパム'などのフォルダの配列値を表します。しかし、$rootは、chosenFolderIdgoToFolderのようなViewModelのルート関数を表します。

は、私は、このリンクの例では、より多くのあなたを助けるだろうと思いhttp://www.dotnet-tricks.com/Tutorial/knockout/bSKG240313-Understanding-Knockout-Binding-Context-Variable.html

を参照してください。

関連する問題