Javascript 为什么这里需要$root?
我只是参考knockout.js的教程: 在UI中,标记为: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
<!-- 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());