最近、 Telerik Treeview コンポーネントを処理し、より大きなデータ セット (500 ~ 1000 以上のノード) を処理するときにチェックボックスを使用して再帰的な選択を処理するという問題に遭遇しました。
より小さなデータ セット (100 ~ 300 ノード) では、Treeview とその選択方法は次のように機能します (当然のことです)。
最初は、すべてのノードが選択されています。
親ノードをクリックすると、すべての子ノードの選択が切り替わります。
- 1 つの子ノードを選択解除すると、親 (およびすべての祖父母/最上位ノード) が選択解除されます。
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)
}
});