Tôi có một chỉ thị AngularJS hiển thị một tập hợp các thực thể trong mẫu sau:
<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>
Như bạn có thể thấy, đó là <table>
nơi mỗi hàng có thể được chọn riêng lẻ bằng hộp kiểm của riêng nó hoặc tất cả các hàng có thể được chọn cùng một lúc với hộp kiểm chính nằm trong <thead>
. Giao diện người dùng khá cổ điển.
Cách tốt nhất để:
- Chọn một hàng duy nhất (tức là khi hộp kiểm được chọn, hãy thêm id của thực thể đã chọn vào một mảng bên trong và thêm một lớp CSS vào
<tr>
thực thể chứa để phản ánh trạng thái đã chọn của nó)? - Chọn tất cả các hàng cùng một lúc? (tức là thực hiện các hành động được mô tả trước đó cho tất cả các hàng trong
<table>
)
Cách triển khai hiện tại của tôi là thêm bộ điều khiển tùy chỉnh vào chỉ thị của tôi:
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??
};
}
Cụ thể hơn, tôi tự hỏi:
- Đoạn mã trên có nằm trong một bộ điều khiển hay nó phải đi trong một
link
hàm? - Cho rằng jQuery không nhất thiết phải xuất hiện (AngularJS không yêu cầu), cách tốt nhất để thực hiện duyệt DOM là gì? Nếu không có jQuery, tôi gặp khó khăn khi chỉ chọn
<tr>
hộp kiểm cha của một hộp kiểm nhất định hoặc chọn tất cả các hộp kiểm trong mẫu. - Đi qua
$event
đểupdateSelection()
không có vẻ rất thanh lịch. Không có cách nào tốt hơn để truy xuất trạng thái (đã chọn / bỏ chọn) của một phần tử vừa được nhấp?
Cảm ơn bạn.
ngChecked
chỉ thị. (Điều hối tiếc duy nhất của tôi là chúng tôi không thể làm cho mã này ít dài dòng hơn một chút.)