【问题标题】:What is the origin and purpose of the variable $data in KnockoutJS?KnockoutJS 中变量 $data 的由来和目的是什么?
【发布时间】:2011-12-11 22:29:18
【问题描述】:

KnockoutJS tutorials 中,我偶然发现了以下代码示例,其中包含无法解释的变量$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 时,该示例不再起作用。

这里发生了什么魔法?

【问题讨论】:

  • 好问题。我为此苦苦挣扎。

标签: javascript html knockout.js


【解决方案1】:

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

【讨论】:

  • 感谢您的简短解释。那么$data 变量只有在使用foreach 时才存在?
  • 您也可以通过在模板声明中使用 data 参数来提供它的值。此外,如果 data 或 foreach 参数均不存在,则默认为模板的整个视图模型
  • 还有其他内置变量吗?
  • 他们真的应该解释一下
【解决方案2】:

$data 是Knockout's Binding Contexts 的一部分。

这里是所有的内置变量:

  • $父级
  • $父母
  • $root
  • $组件
  • $数据
  • $index(仅在 foreach 绑定中可用)
  • $parentContext
  • $rawData
  • $componentTemplateNodes

【讨论】:

  • 感谢您的链接。我没有在网站的导航中找到它。
  • 这很有帮助!谢谢
【解决方案3】:

我成功了

.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/

【讨论】:

  • 让它工作不是问题。教程页面上甚至提供了解决方案。
猜你喜欢
  • 2018-02-09
  • 2020-02-08
  • 2014-08-04
  • 1970-01-01
  • 2012-03-20
  • 2011-10-04
  • 1970-01-01
相关资源
最近更新 更多