Tengo una directiva AngularJS que representa una colección de entidades en la siguiente plantilla:
<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>
Como puede ver, es un lugar <table>donde cada fila se puede seleccionar individualmente con su propia casilla de verificación, o todas las filas se pueden seleccionar a la vez con una casilla de verificación maestra ubicada en el <thead>. Interfaz de usuario bastante clásica.
Cuál es la mejor forma de:
- Seleccione una sola fila (es decir, cuando la casilla de verificación esté marcada, agregue la identificación de la entidad seleccionada a una matriz interna y agregue una clase CSS al que
<tr>contiene la entidad para reflejar su estado seleccionado). - ¿Seleccionar todas las filas a la vez? (es decir, realice las acciones descritas anteriormente para todas las filas del
<table>)
Mi implementación actual es agregar un controlador personalizado a mi directiva:
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??
};
}
Más específicamente, me pregunto:
- ¿El código anterior pertenece a un controlador o debería ir en un
linkfunción? - Dado que jQuery no está necesariamente presente (AngularJS no lo requiere), ¿cuál es la mejor manera de hacer un recorrido DOM? Sin jQuery, estoy teniendo dificultades para seleccionar el padre
<tr>de una casilla de verificación determinada o seleccionar todas las casillas de verificación en la plantilla. - Pasar
$eventaupdateSelection()no parece muy elegante. ¿No hay una mejor manera de recuperar el estado (marcado / desmarcado) de un elemento en el que se acaba de hacer clic?
Gracias.
ngCheckeddirectiva. (Lo único que lamento es que no podamos hacer que este código sea un poco menos detallado.)