KnockoutJS中的$ data变量的来源和目的是什么?


67

KnockoutJS教程中,我偶然发现了以下代码示例,其中包含无法解释的变量$data

视图(html):

<!-- Folders -->
<ul class="folders" data-bind="template: { name: 'folderTemplate', foreach: folders }"></ul>
<script type="text/html" id="folderTemplate">
    <li data-bind="css: { selected: $data == mailViewModel.selectedFolder() },
                   click: function() { mailViewModel.selectFolder($data) }">
        ${$data}
    </li>    
</script>

视图模型(JavaScript):

var viewModel = {
    // Data
    folders: ['Inbox', 'Archive', 'Sent', 'Spam'],
    selectedFolder: ko.observable('Inbox'),

    // Behaviours
    selectFolder: function (folder) {
        this.selectedFolder(folder);
    }    
};

window.mailViewModel = viewModel;
ko.applyBindings(viewModel);

本教程没有任何解释,说明该美元符号的用途以及它的$data来源。变量$data是行不通定义,当我重新命名的三个实例$data$foobar,示例不工作了。

这是什么魔术?


2
好问题。我为此感到挣扎。
DavidHyogo 2012年

Answers:


41

$data变量是一个内置变量,用于引用要绑定的当前对象。在示例中,这是viewModel.folders数组中的元素之一。


感谢您的简短说明。那么该$data变量仅在使用a时存在foreach吗?
dokaspar 2011年

1
您还可以通过使用模板声明中的data参数来提供其值。同样,如果data或foreach参数均不存在,则默认为模板的整个视图模型
Thedric Walker 2011年

3
还有其他内置变量吗?
Nowaker

3
他们真的应该解释一下
Revolutionair


0

我成功了

.selected {
    color:red;
}

<ul class="folders" data-bind="template: { name: 'folderTemplate', foreach: folders }"></ul>
<script type="text/html" id="folderTemplate">
    <li data-bind="css: { selected: $data == mailViewModel.selectedFolder() },text:$data,
                   click: function() { mailViewModel.selectFolder($data) }">
    </li>    
</script>

var viewModel = {
    // Data
    folders: ['Inbox', 'Archive', 'Sent', 'Spam'],
    selectedFolder: ko.observable('Inbox'),

    // Behaviours
    selectFolder: function (folder) {
        this.selectedFolder(folder);
    }    
};

window.mailViewModel = viewModel;
ko.applyBindings(viewModel);

请看一下 http://jsfiddle.net/bowen31337/48RDd/


2
使它工作不是问题。教程页面上甚至提供了解决方案。
dokaspar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.