У мене є директива AngularJS, яка відображає колекцію сутностей у такому шаблоні:
<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>
Як ви можете бачити, це те, <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()здається не дуже елегантним. Чи не існує кращого способу отримати стан (позначений / не позначений) елемента, на який щойно клацнули?
Дякую.
ngCheckedдирективу. (Я шкодую лише про те, що ми не можемо зробити цей код дещо детальнішим.)