次のテンプレートのエンティティのコレクションをレンダリングする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>
。かなり古典的なUI。
次の最善の方法は何ですか。
- 単一の行を選択します(つまり、チェックボックスがオンになっている場合、選択したエンティティのIDを内部配列に追加
<tr>
し、選択した状態を反映するために、エンティティを含むCSSクラスを追加します)? - すべての行を一度に選択しますか?(つまり、のすべての行に対して前述のアクションを実行します
<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()
はあまりエレガントではないようです。クリックされたばかりの要素の状態(チェックされている/チェックされていない)を取得するためのより良い方法はありませんか?
ありがとうございました。