2011-12-28 45 views
0

我想處理backing bean中<h:panelGroup>內的所有<p:panel>組件。我已將<h:panelGroup>綁定到支持bean屬性。但在@PostConstruct方法期間,該屬性爲null。在物業setPanel()的制定者期間,組件沒有孩子。如果我使用按鈕提交某些內容,那麼我可以獲得面板的孩子。如何在@PostConstruct方法中訪問組件的子項?

@PostConstruct方法中獲取組件的子項需要做些什麼?

查看:

<h:panelGroup binding="#{wiz.panel}"> 
    <p:panel header="one"> 
     <h:outputText value="primeiro" /> 
    </p:panel> 

    <p:panel header="two"> 
     <h:outputText value="segundo" /> 
     <h:inputText /> 
    </p:panel> 

    <p:panel header="three"> 
     <h:outputText value="terceiro" /> 
    </p:panel> 

    <p:panel header="four"> 
     <h:outputText value="quarto" /> 
    </p:panel> 
</h:panelGroup> 

支持bean

@PostConstruct 
public void init() { 
    if (getPanel() != null) { 
     for (UIComponent comp : getPanel().getChildren()) { 
      if (comp instanceof Panel) { 
       System.out.println(((Panel) comp).getHeader()); 
      } 
      System.out.println("not a panel child"); 
     } 
    } else { 
     System.out.println("panel is null"); 
    } 
} 

回答

0

那是不可能的。可以在組件樹完成構建之前很長時間調用@PostConstruct。而是掛在preRenderView事件。在那個時候,視圖保證已經建立。您可以通過<f:event>在視圖中附加一個事件偵聽器方法如下:

<f:event type="preRenderView" listener="#{bean.init}" /> 

不要忘記從init()方法去除@PostConstruct註解或重命名如有必要/分割方法。

不用說,這種方法是可疑的。我建議重新考慮你的方法,如果需要的話,可以提出一個新的問題,其中你詳細說明了功能要求。也許最終的答案只是使用普通EL和/或rendered屬性。

+0

f:event現在正在調用init方法,但getPanel()還沒有孩子。是否有另一種「類型」我應該嘗試? – 2011-12-28 19:02:46

+0

getPanel()方法只返回'panel',對吧? (順便說一句,爲什麼不直接訪問'panel'?)。您使用的是JSF impl/version?它適用於Mojarra 2.1.4中的我。 – BalusC 2011-12-28 19:06:08