Когда вы используете {{each}} синтаксис в шаблонах jQuery, контекст данных - это то, с чем связан весь шаблон.В вашем случае это вся модель представления.
Несколько опций:
1 - вы можете использовать свой текущий код и передать элемент, который «вам нравится», в функцию, например (http://jsfiddle.net/rniemeyer/qB9tp/1/):
<div data-bind="click: function() { $root.deleteImage($value); }">Delete</div>
Использование анонимной функции в привязке данных довольно уродливо.Есть лучшие варианты.
2 - вы можете использовать параметр foreach
привязки шаблона, который работает с шаблонами jQuery и более эффективен, чем {{each}}, как (http://jsfiddle.net/rniemeyer/qB9tp/2/):
<script type="text/html" id="imgsList">
<div style="float:left; margin: 10px 10px 10px 0;">
<div>
<a href="${Filename}">${Filename}</a>
</div>
<div data-bind="click: $root.deleteImage">Delete</div>
</div>
</script>
<div data-bind="template: { name: 'imgsList', foreach: model.Imgs }"></div>
Теперь контекст шаблона - это отдельный объект изображения, и вызов $root.deleteImage
передаст его в качестве первого аргумента.
3 - Поскольку плагин jQuery Templatesустарел, а Knockout теперь поддерживает собственные шаблоны, вы можете выбрать удаление зависимости от плагина jQuery Templates.Вы по-прежнему можете использовать именованный шаблон (просто нужно заменить любой синтаксис шаблонов jQuery на атрибуты привязки данных), например: http://jsfiddle.net/rniemeyer/qB9tp/3/ или даже удалить шаблон и просто использовать привязку потока управления foreach
, например: http://jsfiddle.net/rniemeyer/qB9tp/4/
<div data-bind="foreach: model.Imgs">
<div style="float:left; margin: 10px 10px 10px 0;">
<div>
<a data-bind="text: Filename, attr: { href: Filename }"></a>
</div>
<div data-bind="click: $root.deleteImage">Delete</div>
</div>
</div>
4 - Хотя я предпочитаю вариант № 3, вы можете даже выбрать использование делегирования события и подключить «живой» обработчик, например: http://jsfiddle.net/rniemeyer/qB9tp/5/
$("#main").on("click", ".del", function() {
var data = ko.dataFor(this);
viewModel.deleteImage(data);
});
Этоможет быть особенно полезным, если вы будете подключать большое количество одинаковых обработчиков через привязку click
(как в сетке).