2012-10-21 114 views
1

我想更新primefaces樹的孩子,而無需從服務器拉整個樹。JSF更新的primefaces樹兒童

我可以更新整個樹,但不是唯一的一個特定節點的孩子......

編輯:

這是我的代碼示例:

<p:tree value="#{cc.tree}" var="wrapper" id="tree" widgetVar="tree" styleClass="commentTree-#{cc.id}"> 
    <p:treeNode id="treeNode" styleClass="treenode-#{wrapper.id}"> 
     Hallo: #{wrapper.text} 
    </p:treeNode> 
</p:tree> 

現在我想更新一個特定的treenode。

function findIDbySelector(selector) { 
    return $(selector).first().attr('id'); 
} 

function updateComponent(clientID) { 
    var ajax_json = {}; 
    ajax_json['source'] = '#{cc.id}'; 
    ajax_json['update'] = clientID; 

    PrimeFaces.ajax.AjaxRequest(ajax_json); 
} 

[...] 

updateComponent(findIDbySelector('.treenode-1')); 

正如我所說的,我可以更新整個樹,但我只是想更新單個樹節點。

(代碼可能包含bug /錯別字,因爲它被剝離下來)

+0

幹了什麼你嘗試到目前爲止? –

+0

我試圖更新由primefaces生成的子樹,但因爲它們不是jsf組件,所以失敗。我看看primefaces如何在他們的「動態樹」示例中加載數據,但是每次展開節點時都會加載整個樹,這對我來說是不可選的。 –

+0

請張貼您的.xhtml和.java文件,以便我們可以引導您 –

回答

1

我爬到了一下通過primefaces來源,看到他們支持這對我來說是足夠了孩子的加載(我可以包裝包含節點到面板中並更新該節點和子節點)。

要更新我修改了primefaces expandnode方法兒女

function loadNodes(tree, c) { 
    var a = tree; 
    if (tree.cfg.dynamic) { 
     if (tree.cfg.cache && c.children(".ui-treenode-children").children().length > 0) { 
      tree.showNodeChildren(c); 
      return 
     } 
     if (c.data("processing")) { 
      PrimeFaces.debug("Node is already being expanded, ignoring expand event."); 
      return 
     } 
     c.data("processing", true); 
     var b = { 
      source: tree.id, 
      process: tree.id, 
      update: tree.id, 
      formId: tree.cfg.formId 
     }; 
     b.onsuccess = function (j) { 
      var g = $(j.documentElement), 
       h = g.find("update"); 
      for (var e = 0; e < h.length; e++) { 
       var l = h.eq(e), 
        k = l.attr("id"), 
        f = l.text(); 
       if (k == a.id) { 
        c.children(".ui-treenode-children").html(f); 
        a.showNodeChildren(c) 
       } else { 
        PrimeFaces.ajax.AjaxUtils.updateElement.call(tree, k, f) 
       } 
      } 
      PrimeFaces.ajax.AjaxUtils.handleResponse.call(tree, g); 
      return true 
     }; 
     b.oncomplete = function() { 
      c.removeData("processing") 
     }; 
     b.params = [{ 
      name: tree.id + "_expandNode", 
      value: a.getRowKey(c) 
     }]; 
     if (tree.hasBehavior("expand")) { 
      var d = tree.cfg.behaviors.expand; 
      d.call(tree, c, b) 
     } else { 
      PrimeFaces.ajax.AjaxRequest(b) 
     } 
    } else { 
     tree.showNodeChildren(c); 
     tree.fireExpandEvent(c) 
    } 
} 

的示例呼叫可以是:

loadNodes(tree, $('#j_idt62\\:tree\\:0')); 

哪裏tree是p的WidgetVar:樹

+1

作爲便箋:不要通過生成的id(j_idt ..)引用元素。 – siebz0r

+0

這只是爲了這個例子:)我通過一個獨特的類獲得id:'function findIDbySelector(selector){ \t \t \t \t return $(selector).first()。attr('id'); \t \t \t}' –