为什么需要$ root?

Tim*_*Tom 12 javascript knockout.js

我只是从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>
Run Code Online (Sandbox Code Playgroud)

它的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());
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我什么是$ root,为什么需要它?如果我删除它,它不起作用.

fre*_*ish 29

$root是指KnockoutJS层次结构中的顶级模型(您使用的模型.applyBindings).在你的情况下,WebmailViewModel对象是$root.

这是必需的,因为当你foreach在循环中使用时,上下文会发生变化.您要在此处触发的所有内容都与循环中的元素相关联.因此,您需要$root使用在该上下文之外定义的函数/字段(在您的情况下chosenFolderIdWebmailViewModel对象的方法).


Jim*_*ert 5

您需要查看绑定上下文页面.

$根

这是根上下文中的主视图模型对象,即最顶层的父上下文.它相当于$ parents [$ parents.length - 1].