0

dynatree の検索機能を使用する必要があるため、次の回避策を見つけました: JQuery Dynatree - search node by name

ただし、展開されたノード区切り記号までのみ検索する必要があります。(jQuery ui-slider を使用して展開区切り文字を動的に設定しています)。最初に、minExpandedLevel まで検索する必要があります。スライダーを動かすと、ダイナツリーは一致する結果のみをスライダーの値に相当する拡張レベルで表示する必要があります。

minExpandLevel をリセットして dynatree をリロードしようとしても、結果としてすべての (一致しない場合でも) ノードが返されるため、うまくいきません。

だから私は次のような制限パラメータを検索機能に追加したい:

$(selector).dynatree("getRoot").search(パターン、制限);

誰もこれを行う方法を知っていますか?

これが私のコードです:

ダイナツリー:

$.ui.dynatree.nodedatadefaults["icon"] = false;

$("#resultTree").dynatree({
    minExpandLevel: 4,
    persist: false,
    classNames: {
        vline: "no-bg",
        connector: "",
        expander: "ui-helper-hidden"
    },
    children: myJsonData
});

スライダー:

timeout = false;
searchTerm = $("#searchText").val();
$("#treeslider").slider({
    min: minTick,
    max: maxTick,
    range: "min",
    slide: function (event, ui) {
        if (timeout) {
            clearTimeout(timeout);
        }
        timeout = setTimeout(function () {
            $("#resultTree").dynatree("getRoot").search(searchTerm, ui.value);
        }, 500);

    }
});
4

2 に答える 2

1

さて、私は答えを見つけたと思います:

_searchNode関数を変更して、レベル区切り文字よりも大きい一致ノードを非表示にしますが、用語がその子内で一致する限り、親ノード (一致しない場合でも) を表示します。

var clear = true;
DynaTreeNode.prototype.search = function (pattern,limit) {
if (typeof limit == "undefined") {
    limit = 0;
}

if (pattern.length < 1 && !clear) {
    clear = true;
    this.visit(function (node) {
        node.expand(true);
        node.li.hidden = false;
        node.expand(false);
    });
} else if (pattern.length >= 1) {
    clear = false;
    this.visit(function (node) {
        node.expand(true);
        node.li.hidden = false;
    });
    var searchDepth = 1;
    for (var i = 0; i < this.childList.length; i++) {
        var hide = { hide: false };
        this.childList[i]._searchNode(pattern, hide, searchDepth, limit);
    }
}
},

// bottom-up node searching function
DynaTreeNode.prototype._searchNode = function (pattern, hide, searchDepth, limit) {
    var level = searchDepth;
    if (this.childList) {
        // parent node
        var hideNode = true;
        var searchDepth = level+1;
        for (var i = 0; i < this.childList.length; i++) {
            var hideChild = { hide: false };
            this.childList[i]._searchNode(pattern, hideChild, searchDepth, limit);
            hideNode = hideNode && hideChild.hide;
        }

        if (hideNode && !this._isRightWithPattern(pattern)) {
            this._hideNode();
            hide.hide = true;
        } else {
            if (limit && level > limit) {
                this._hideNode();
            }
            hide.hide = false;
        }

    } else {
        // leaf        
        if (!this._isRightWithPattern(pattern)) {
            this._hideNode();
            hide.hide = true;
        } else {
            if (limit && level > limit) {
                this._hideNode();
            }
            hide.hide = false;
        }
    }
}
于 2014-01-06T06:54:19.247 に答える