Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这里需要$root?_Javascript_Knockout.js - Fatal编程技术网

Javascript 为什么这里需要$root?

Javascript 为什么这里需要$root?,javascript,knockout.js,Javascript,Knockout.js,我只是参考knockout.js的教程: 在UI中,标记为: <!-- Folders --> <ul class="folders" data-bind="foreach: folders"> <li data-bind="text: $data, css: { selected: $data == $root.chosenFolderId() }, click: $root.g

我只是参考knockout.js的教程:

在UI中,标记为:

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

谁能告诉我$root是什么,为什么需要它?如果我删除它,它将不起作用。

$root
指的是KnockoutJS层次结构中的顶级模型(您在
.applyBindings
中使用的模型)。在您的例子中,
WebmailViewModel
对象是
$root


这是必需的,因为当您使用
foreach
时,循环内部的上下文会发生变化。这里要激发的所有内容都与循环中的一个元素相关联。因此,您需要
$root
来使用在该上下文之外定义的函数/字段(在您的示例中,
chosenFolderId
WebmailViewModel
对象的一种方法)

您需要签出该页面

$root

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


$root
上下文始终引用顶级ViewModel,而不管循环或范围中的其他更改。这允许我们访问用于操纵ViewModel的顶级方法

在您的示例中,
$data
表示到文件夹的数组值,如“收件箱”、“存档”、“已发送”和“垃圾邮件”。但
$root
表示ViewModel的根函数,如
chosenFolderId
goToFolder


我认为此链接示例将对您帮助更大。

您的答案对我很有帮助,+1
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());