2013-12-20 59 views
0

我需要使用搜索功能爲我的dynatree等我發現這個解決辦法:JQuery Dynatree - search node by nameJQuery Dynatree - 如何使用級別分隔符搜索節點?

不過,我需要把它只能搜索,直到我展開的節點分隔符。 (我使用jQuery UI的滑塊來動態地設置擴大分隔符)。 最初,我需要它來搜索,直到我minExpandedLevel。如果我移動滑塊時,dynatree應顯示在擴展級僅匹配結果相當於滑塊值。

嘗試重置minExpandLevel和重裝dynatree只是不會做,因爲它返回所有(甚至非匹配)的節點作爲結果。

所以我要到了一個極限參數添加到像搜索功能:

$(選擇).dynatree( 「getRoot」)搜索(模式,限制);

是否有人知道如何做到這一點?

這裏是我的代碼:

dynatree:

$.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); 

    } 
}); 

回答

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; 
     } 
    } 
} 
+0

嗨,這似乎正是我後,但我絕對不知道在哪裏把這個!你可以給出簡要的細節,哪些文件(jquery.dynatree.js我假設)和行蹤。 – JasonMHirst

+0

不要認爲這是一個'答案',但最終設法找到該代碼的位置。對於任何其他人(並且有幾個),查找行「var DynaTree = Class.create();」然後粘貼上面的代碼。它工作100%:) – JasonMHirst

1

這裏的代碼片段從根開始和訪問每個節點,但沒有按「T過程在第3級或更低的節點:

$("#tree").dynatree("getRoot").visit(function(node){ 

    if(node.getLevel() > 2) { 
     return 'skip'; 
    } 

    console.log('processing node "' + node.data.title + '" at level ' + node.getLevel()); 

}); 

如果返回字符串'skip',則訪問函數將停止處理分支。

+0

哦謝謝,這適用於自上而下的搜索,但我需要一種自下而上的搜索方法。這就是爲什麼我需要利用[_searchNode(http://stackoverflow.com/questions/12277797/jquery-dynatree-search-node-by-name)方法。現在,如果搜索直到最後一個節點,並且如果它大於我的級別分隔符,那麼我該如何搜索? – thanatosphere

+0

這樣,即使只有最後一個節點與搜索詞相匹配,它也會顯示<=分隔符的父節點。 – thanatosphere