12

私はknockout.jsのチュートリアルを参照しています:

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

UIでは、マークアップは次のとおりです。

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

ViewModelは次のとおりです。

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とは何ですか、なぜそれが必要なのか誰かに教えてもらえますか?削除しても動作しません。

4

3 に答える 3

29

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

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

于 2012-05-29T10:59:44.410 に答える
5

バインディングコンテキストページを確認する必要があります。

$ root

これは、ルートコンテキスト、つまり最上位の親コンテキストのメインビューモデルオブジェクトです。これは$parents[$parents.length-1]と同等です。

于 2012-05-29T11:01:23.817 に答える
0

ループやその他のスコープの変更に関係なく、コンテキストは常に最$root上位のViewModelを参照します。これにより、ViewModelを操作するためのトップレベルのメソッドにアクセスできます。

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

http://www.dotnet-tricks.com/Tutorial/knockout/bSKG240313-Understanding-Knockout-Binding-Context-Variable.htmlを参照してください

このリンクの例はもっと役立つと思います。

于 2016-06-07T11:22:15.137 に答える