1

私の要件の 1 つは、jstree で選択されたノードのすべての子ノードを (必要に応じて ajax を介して) ロードし、その下にあるリーフ ノードのすべてのアンカー要素 ID を返すことです。選択したノードを open_all メソッドに渡すことでこれを行うことができ、open_all イベントでリード ノードの ID を返します。ただし、私の問題は、選択したノードがルート以外の非リーフ ノードである場合、open_all イベントが 2 回発生することです。選択したノードがルートまたはリーフの場合は正常に機能します。どんな助けでも大歓迎です。

$tree
    .bind("loaded.jstree", function(event, data) {
        //alert("Tree loaded");
    })
    .bind("select_node.jstree", function(event, data) {            
        data.inst.open_all(data.rslt.obj, true);
    })
    .bind("check_node.jstree", function(event, data) { 
        //checkboxes are enabled on some pages
        data.inst.open_all(data.rslt.obj, true);
    })
    .bind("open_all.jstree", function(event, data) {
      //get all ids of leaf nodes under selected node if selected node is 
      //non-leaf node. If selected node is a leaf node return it's id.

      //alert(leaf_ids); 

      //**Here is my problem:** The alert box pops up twice if 
      //open_all was passed a non-leaf node other than root.The first time 
      //ids are empty but the second time I see the ids.           
    })
    .jstree({
        "plugins": plugins_include,
        "core": core_options,
        "html_data": html_data,
        "themes": {
            "theme": "classic",
            "dots": false,
            "icons": false
        },
        "strings": { loading: "Loading..." },
        "checkbox": {
            "override_ui": true
        },
        "ui": { "select_multiple_modifier": false }
    }); 
4

2 に答える 2

1

open_allを使用してバインドする理由がもっと深いかどうかはわかりませんが、open_nodeもオプションです。

.bind("open_node.jstree", function (event, data) {
    var node = $(data.rslt.obj);
    var nodeID = node.attr('id');

    var children = $.jstree._reference(node)._get_children(node);
    if (children.length==0){
    // Dynamically load node since it has nothing loaded yet
    }
})
于 2012-04-27T01:53:41.110 に答える
1

問題を解決するには、jstree プラグインの open_all メソッドを変更する必要がありました。

open_all 関数の最後の行にもう 1 つの条件を追加しました: this.is_open(original_obj)

// すべてのノードが開いた後にコールバックが発生するように
if ( this.is_open(original_obj) && original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj": original_obj }); }

この変更を行うとすぐに、アラート ボックスが 2 回表示されなくなりました。

于 2012-07-03T15:58:43.540 に答える