我检查了文档,我认为没有任何公开的 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 似乎不能很好地处理。
更新
因此,我检查了您共享的 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/
我还想补充一下,感谢post,根据UI-Grid documentation:无法编辑组标题行,如果使用选择功能,则无法选择。但是,它们可以被导出。
因此,很难让它发挥作用是故意的,因为它不是预期的设计。我的建议是更改您的逻辑以使用树级别或绕过选择逻辑,因为即使我的分叉当前正在选择所有内容,您很可能会遇到其他问题。例如:当您单击另一个组标题时,我无法在网格中自动取消选择。