#javascript #html #knockout.js
#javascript #HTML #knockout.js
Вопрос:
В уроках 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
, пример больше не работает.
Что за магия здесь происходит?
Комментарии:
1. Отличный вопрос. Я боролся с этим.
Ответ №1:
$data является частью контекстов привязки Knockout.
Вот все встроенные переменные:
- $parent
- $parents
- $root
- $component
- $data
- $index (доступен только в привязках foreach)
- $parentContext
- $RawData
- $componentTemplateNodes
Комментарии:
1. Спасибо за ссылку. Я не нашел его в навигации на сайте.
Ответ №2:
$data
Переменная — это встроенная переменная, используемая для ссылки на текущий привязываемый объект. В примере это один из элементов viewModel.folders
массива.
Комментарии:
1. Спасибо за ваше краткое объяснение. Значит
$data
, переменная существует только тогда, когдаforeach
используется a ?2. Вы также можете указать ее значение, используя параметр data в объявлении шаблона. Кроме того, если ни параметр data, ни foreach не присутствуют, по умолчанию используется вся модель представления для шаблона
3. Существуют ли какие-либо другие встроенные переменные?
4. Они действительно должны были объяснить это
Ответ №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 /
Комментарии:
1. Заставить ее работать не было проблемой. Решение доступно даже на страницах учебника.