我最近在处理较大的数据集(500-1000+ 个节点)时遇到了处理Telerik Treeview 组件和使用复选框处理递归选择的问题。
对于较小的数据集(100-300 个节点),Treeview 及其选择方法的工作方式如下(应该如此):
最初 - 选择所有节点。
单击父节点会切换所有子节点的选择。
- 取消选择单个子节点将取消选择父节点(以及任何祖父/顶级节点)
我认为在处理 Treeviews 和选择时,这些事情中的大多数都是相当普遍的。当前使用的方法不是最干净的,并且在选择过程中调用了不必要的额外事件。
我只是好奇在我开始分解当前代码(见下文)之前是否有人处理过类似的问题。
现有选择代码:
$('#TreeView').find("li").find('> div > .t-checkbox :checkbox').bind('click', function (e) {
var isChecked = $(e.target).is(':checked');
var treeView = $($(e.target).closest('.t-treeview')).data('tTreeView');
var item = $(e.target).closest('.t-item');
var checkboxes = item.find('.t-checkbox :checkbox');
$.each(checkboxes, function (index, checkbox) { $(checkbox).attr('checked', isChecked ? true : false); treeView.checkboxClick(e, checkbox); });
var siblings = item.parent().find('> li .t-checkbox');
var siblingsLength = siblings.length;
var checkedLength = siblings.find(':checked').length;
if (siblingsLength == checkedLength) {
var parentCheckBox = item.parent().closest('.t-item').find('> div .t-checkbox :checkbox');
var grandparentCheckBox = item.parent().parent().parent().closest('.t-item').find('> div .t-checkbox :checkbox');
parentCheckBox.attr('checked', true)
grandparentCheckBox.attr('checked', true)
treeView.checkboxClick(e, parentCheckBox)
treeView.checkboxClick(e, grandparentCheckBox)
}
else {
var parentCheckBox = item.parent().closest('.t-item').find('> div .t-checkbox :checkbox');
var grandparentCheckBox = item.parent().parent().parent().closest('.t-item').find('> div .t-checkbox :checkbox');
parentCheckBox.attr('checked', false)
grandparentCheckBox.attr('checked', false)
treeView.checkboxClick(e, parentCheckBox)
treeView.checkboxClick(e, grandparentCheckBox)
}
});