Ich habe eine AngularJS- Direktive , die eine Sammlung von Entitäten in der folgenden Vorlage rendert:
<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>
Wie Sie sehen können, kann <table>
hier jede Zeile einzeln mit einem eigenen Kontrollkästchen ausgewählt werden, oder es können alle Zeilen gleichzeitig mit einem Master-Kontrollkästchen im Feld ausgewählt werden <thead>
. Ziemlich klassische Benutzeroberfläche.
Was ist der beste Weg, um:
- Wählen Sie eine einzelne Zeile aus (dh wenn das Kontrollkästchen aktiviert ist, fügen Sie die ID der ausgewählten Entität einem internen Array hinzu und fügen Sie
<tr>
der Entität, die die Entität enthält , eine CSS-Klasse hinzu , um den ausgewählten Status wiederzugeben)? - Alle Zeilen gleichzeitig auswählen? (dh führen Sie die zuvor beschriebenen Aktionen für alle Zeilen in der
<table>
)
Meine aktuelle Implementierung besteht darin, meiner Direktive einen benutzerdefinierten Controller hinzuzufügen:
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??
};
}
Genauer gesagt frage ich mich:
- Gehört der obige Code in eine Steuerung oder sollte er in eine
link
Funktion gehen? - Was ist der beste Weg, um DOM-Traversal durchzuführen, da jQuery nicht unbedingt vorhanden ist (AngularJS benötigt es nicht)? Ohne jQuery fällt es mir schwer, nur das übergeordnete
<tr>
Kontrollkästchen oder alle Kontrollkästchen in der Vorlage auszuwählen. - Die Weitergabe
$event
anupdateSelection()
scheint nicht sehr elegant zu sein. Gibt es nicht eine bessere Möglichkeit, den Status (aktiviert / deaktiviert) eines Elements abzurufen, auf das gerade geklickt wurde?
Vielen Dank.
ngChecked
Richtlinie erfahren . (Ich bedaure nur, dass wir diesen Code nicht weniger ausführlich machen können.)