Как получить доступ к индексу элемента в шаблоне knockout.js
Внутри моего шаблона ниже, как я могу получить доступ к индексу отображаемого элемента?
<table>
<tbody data-bind="foreach:contacts">
<tr class="contactRow" valign="top">
<td><a href="#" data-bind="click: function(){viewModel.removeContact($data)}">Delete</td>
<td><input data-bind="value: FirstName" name="Contacts[].FirstName"/></td>
<td><input data-bind="value: LastName" name= "Contacts[].LastName" /></td>
<td><input data-bind="value: Username" name="Contacts[].Username"/></td>
<td><input data-bind="value: Email" name="Contacts[].Email"/></td>
</tr>
</tbody>
<thead>
<tr>
<th>Controls</th>
<th>First Name</th>
<th>Last Name</th>
<th>Username</th>
<th>Email</th>
</tr>
</thead>
</table>
Ответы
Ответ 1
Обновление: $index
теперь доступно в KO 2.1.
В настоящее время нет способа прямого доступа к индексу в foreach
. Существует запрос на перенос, в котором рассматривается добавление переменной $index
: https://github.com/SteveSanderson/knockout/pull/182
Вариант, который я использовал в прошлом, - это использовать ручную подписку против наблюдаемого массива, который сохраняет синхронизируемый индекс.
Он работает как:
//attach index to items whenever array changes
viewModel.tasks.subscribe(function() {
var tasks = this.tasks();
for (var i = 0, j = tasks.length; i < j; i++) {
var task = tasks[i];
if (!task.index) {
task.index = ko.observable(i);
} else {
task.index(i);
}
}
}, viewModel);
Вот пример: http://jsfiddle.net/rniemeyer/CXBFN/
Ответ 2
Я делаю это, и он работает очень хорошо. Не самый лучший, но все в порядке:
Используйте привязку attr: для установки атрибута имени вашего поля, а затем используйте $parent.CallForwards.indexOf($data)
для получения вашего индекса.
data-bind="value: Name, attr: {name: 'CallForwards[' + $parent.CallForwards.indexOf($data) + '].Name'}"
Ответ 3
Я считаю, что с KO 2.1 это становится проще: вы можете использовать $index в цикле foreach, чтобы ссылаться на текущий индекс.
https://github.com/downloads/SteveSanderson/knockout/knockout-2.1.0.js
: http://knockoutjs.com/documentation/binding-context.html