0

dynatreeディレクトリの階層でマルチノードを選択するために使用しています。

そのため、 のすべての組み込みオプションの動作を調査しましたselectModeが、残念ながら、どれも問題を解決しません。

  • 1: 単一選択 (私の場合ではありません)
  • 2: 複数選択
    • すべての子ノードが選択されている場合、親ノードは選択されません (ok)
    • 親ノードが選択されているときにすべての子ノードを選択するわけではありません (OK ではありません)。
  • 3: 階層的な複数選択
    • すべての子ノードが選択されているときに親ノードを選択します(OKではありません)
    • 親ノードが選択されているときにすべての子ノードを選択します(OK)

次の場合、私の場合の動作は正しいでしょう。

  • すべての子ノードが選択されている場合、親ノードは選択されません
    • すべての子ディレクトリを選択することは、それらの親を選択することとは異なります
  • 親ノードが選択されると、すべての子ノードが選択されます
    • そうしないと、子も選択されていることをユーザーが理解できない可能性があります。

質問 #1: この動作を実装する方法は?

さらに、dtnode.tree.getSelectedNodes()は冗長ノードを返します。

/Foo
/Foo/Bar

が選択されている場合、私にとっては、選択さ/Fooれていることが既に暗示され/Foo/Barています。

質問 #2: 選択したノードの冗長性を最適化する方法は?

4

1 に答える 1

0

私が見る最善の解決策はselectMode: 2、ノードを選択するときに子のチェックボックスの可視性を使用して切り替えることです。

//enable or disable redundant children nodes recursively
function toggleChildrenNodes(disableChildren, dtnode) {
    if (!dtnode)
        return;

    if (!dtnode.childList)
        return;

    for (var chIdx = 0; chIdx < dtnode.childList.length; chIdx++) {
        dtnode.childList[chIdx].data.hideCheckbox = disableChildren;
        dtnode.childList[chIdx].render(true);
        //when re-enabling a child node that was previously selected, it should disable their children
        toggleChildrenNodes(disableChildren || dtnode.childList[chIdx].isSelected(), dtnode.childList[chIdx]);
    }
}

$('#myTree').dynatree({
    selectMode: 2,
    checkbox: true,
    onSelect: function(isSelected, dtnode) {
        if(!dtnode)
            return;

        toggleChildrenNodes(isSelect, dtnode);

        //gets the optimized selected nodes
        var dryNodes = $.map(dtnode.tree.getSelectedNodes(), function(currentSelectedNode, idx) {
            if (!currentSelectedNode.data.hideCheckbox) { //skip redundant nodes
                return currentSelectedNode.data.key;
            }
            return null;
        });
        console.log(dryNodes);
    }
});

さらに、ツリー ノードの展開が遅延している場合は、一貫性を保つために新しい子ノードを処理する必要があります。

onLazyRead: function(dtnode) {
    if(!dtnode)
        return;

    //[...] business logic

    //[...] possible iteration to add N children

    dtnode.addChild({
        //[...] other properties

        //creates childnode with the checkbox hidden if the parent is selected or hidden due to a higher ancestor
        hideCheckbox: dtnode.isSelected() || dtnode.data.hideCheckbox
    });
}
于 2014-04-30T22:23:39.727 に答える