У меня есть AngularJS directive, который отображает коллекцию объектов в следующем шаблоне:
<table class="table">
<thead>
<tr>
<th><input type="checkbox" ng-click="selectAll()"></th>
<th>Title</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="e in entities">
<td><input type="checkbox" name="selected" ng-click="updateSelection($event, e.id)"></td>
<td>{{e.title}}</td>
</tr>
</tbody>
</table>
Как вы можете видеть, это a <table>
, где каждая строка может быть выбрана индивидуально со своим собственным флажком или все строки могут быть выбраны сразу с помощью мастер-флажка, расположенного в <thead>
. Довольно классический интерфейс.
Каков наилучший способ:
- Выберите одну строку (то есть, когда установлен флажок, добавьте идентификатор выбранного объекта во внутренний массив и добавьте класс CSS в
<tr>
, содержащий объект, чтобы отразить его выбранное состояние)? - Выберите все строки сразу? (т.е. выполнить описанные выше действия для всех строк в
<table>
)
Моя текущая реализация заключается в добавлении настраиваемого контроллера в мою директиву:
controller: function($scope) {
// Array of currently selected IDs.
var selected = $scope.selected = [];
// Update the selection when a checkbox is clicked.
$scope.updateSelection = function($event, id) {
var checkbox = $event.target;
var action = (checkbox.checked ? 'add' : 'remove');
if (action == 'add' & selected.indexOf(id) == -1) selected.push(id);
if (action == 'remove' && selected.indexOf(id) != -1) selected.splice(selected.indexOf(id), 1);
// Highlight selected row. HOW??
// $(checkbox).parents('tr').addClass('selected_row', checkbox.checked);
};
// Check (or uncheck) all checkboxes.
$scope.selectAll = function() {
// Iterate on all checkboxes and call updateSelection() on them??
};
}
В частности, мне интересно:
- Используется ли код выше в контроллере или должен ли он работать с функцией
link
? - Учитывая, что jQuery не обязательно присутствует (AngularJS не требует его), какой лучший способ сделать обход DOM? Без jQuery мне сложно выбрать родительский
<tr>
данного флажка или выбрать все флажки в шаблоне. - Передача
$event
вupdateSelection()
не кажется очень элегантной. Разве нет лучшего способа получить состояние (отмечено или не отмечено) элемента, который был просто нажат?
Спасибо.