我有一个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>
。相当经典的用户界面。
最好的方法是:
- 选择单行(即,选中复选框时,将所选实体的ID添加到内部数组,然后将CSS类添加到
<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()
似乎并不很优雅。是否有更好的方法来检索刚刚单击的元素的状态(选中/未选中)?
谢谢。
ngChecked
指令。(我唯一的遗憾是,我们不能使这段代码更加冗长。)