Ответ 1
Я проверил документацию, и я не думаю, что существует какой-либо открытый API-метод. Вы можете рекурсивно выбирать/отменить выбор строк в качестве решения. Попробуйте пример ниже.
$scope.gridApi.selection.on.rowSelectionChanged($scope, function (rowChanged) {
console.log(rowChanged.treeLevel);
if (typeof(rowChanged.treeLevel) !== 'undefined' && rowChanged.treeLevel > -1) {
var children = $scope.gridApi.treeBase.getRowChildren(rowChanged);
selectChildren(children, rowChanged.isSelected);
}
});
function selectChildren(gridRows, selected) {
if (gridRows && gridRows.length > 0) {
gridRows.forEach(function (child) {
if (selected) {
$scope.gridApi.selection.selectRow(child.entity);
} else {
$scope.gridApi.selection.unSelectRow(child.entity);
}
var children = $scope.gridApi.treeBase.getRowChildren(child);
selectChildren(children, selected); //recursively select/de-select children
});
}
}
Здесь рабочий Plunkr: http://plnkr.co/edit/XsoEUncuigj9Cad1vP5E?p=preview
Обработка автоматического отбраковки немного сложнее, хотя кажется, что api не справляется с этим очень хорошо.
UPDATE
Итак, я проверил jsFiddle, которым вы поделились, и сумел заставить его работать с небольшой настройкой.
Я изменил selectionHandler на следующее:
onRegisterApi: function(gridApi) {
$scope.gridApi = gridApi;
$scope.gridApi.selection.on.rowSelectionChanged($scope, function(rowChanged) {
if (rowChanged.treeNode.parentRow) { //Added this parent row selection
rowChanged.treeNode.parentRow.setSelected(rowChanged.isSelected);
}
console.log(rowChanged.treeLevel);
if (typeof(rowChanged.treeLevel) !== 'undefined' && rowChanged.treeLevel > -1) {
var children = $scope.gridApi.treeBase.getRowChildren(rowChanged);
selectChildren(children, rowChanged.isSelected);
}
});
Обратитесь к этой вилке своего кода: https://jsfiddle.net/1eg5v77w/
Недостатком этого является то, что если вы выберете запись низкого уровня (один без детей), он все равно выберет своего родителя. Если вы действительно хотите, чтобы это сработало, вам придется получить доступ к DOM и сделать некоторые уродливые проверки.
$scope.gridApi.selection.on.rowSelectionChanged($scope, function(rowChanged, $event) {
var wasHeaderRowClicked = true;
try { //This can be written more beautifully if you used jQuery. But I would still be against it as it relies on the class of the ui-grid never changing when you update your ui-grid version.
wasHeaderRowClicked = $event
.srcElement
.parentElement
.parentElement
.parentElement
.previousElementSibling
.firstChild
.firstChild
.firstChild
.getAttribute('class') === 'ui-grid-icon-minus-squared';
} catch(err) { console.log('Couldnt determine if header row was clicked'); }
if (rowChanged.treeNode.parentRow && wasHeaderRowClicked) {
rowChanged.treeNode.parentRow.setSelected(rowChanged.isSelected);
}
console.log(rowChanged.treeLevel);
if (typeof(rowChanged.treeLevel) !== 'undefined' && rowChanged.treeLevel > -1) {
var children = $scope.gridApi.treeBase.getRowChildren(rowChanged);
selectChildren(children, rowChanged.isSelected);
}
});
Вот скрипка: https://jsfiddle.net/Lf8p7Luk/1/
Я также хотел бы добавить, благодаря этому сообщению , что согласно пользовательскому интерфейсу -Grid documentation: Строки заголовка группы не могут быть отредактированы, и если вы используете функцию выбора, выбрать нельзя. Однако они могут быть экспортированы.
Так что это намеренно, что так сложно заставить это работать, потому что это не предполагаемый дизайн. Моя рекомендация состояла в том, чтобы изменить вашу логику либо использовать уровни деревьев, либо обойти логику выбора, потому что хотя моя вилка в настоящее время выбирает все, вы, скорее всего, столкнетесь с другими проблемами в будущем. Например: я не мог получить автоматический отбор для работы в сетке при нажатии на другой заголовок группы.