2012-08-09 40 views
1

裏面我有一個看起來遵循的有效身份證鑽嘴魚科findComponent回空當複合材料部件

<custom:container> 
    <custom:checkbox index="0"/> 
    <custom:checkbox index="1"/> 
</custom:container> 

所以encodeBegin第一個電話的時候,它會顯示打標籤<custom:container>的自定義組件,它會嘗試保存這個組件cliend ID,

private String containerClientId; 
public void encodeBegin(FacesContext context, UIComponent component){ 
    if (component instanceof ManyCheckboxContainer) {    
     containerClientId = component.getClientId(context); 
     return; 
    } 
} 

所以encodeEnd被調用時,我打<custom:checkbox index="0"/>,這樣

public void encodeEnd(FacesContext context, UIComponent component) throws IOException { 

    ... 

    if (component instanceof Checkbox) { 
     renderCheckbox(context, (Checkbox) component); 
    } 
    ... 
} 

protected void renderCheckbox(FacesContext facesContext, InforRadio radio) throws IOException { 
    ... 
    UIComponent uiComponent = radio.findComponent(containerClientId); 
    if(uiComponent == null){ 
     //throw error 
    } 
    ... 
} 

如果我沒有這個自定義組件內複合組件,那麼一切工作很好,但一旦我把它放在一個複合組件,radio.findComponent(containerClientId);返回null。這是mojarra中的錯誤嗎?我在2.1.10和2.1.11下測試了這個行爲。

編輯
所以我收回那句話,當我的自定義組件裏面兩個嵌套NamingContainer這種行爲發生,所以像這樣

<h:form id="myForm"> 
    <f:subView id="myView"> 
     <custom:container id="myCustom"> 
      <custom:checkbox index="0"/> 
      <custom:checkbox index="1"/> 
     </custom:container> 
    </f:subView> 
</h:form> 

所以在這種情況下,客戶ID(即回報由component.getClientId(context)),用於<custom:container>myForm:myView:myCustom,但內部鑽嘴魚科,所述findComponent方法具有這

public UIComponent findComponent(String expr) { 
    ... 

    else if (!(base instanceof NamingContainer)) { 
    // Relative expressions start at the closest NamingContainer or root 
    while (base.getParent() != null) { 
     if (base instanceof NamingContainer) { 
      break; 
     } 
     base = base.getParent(); 
    } 
    ... 
} 

所以它尋找下一個祖先NamingContainer,在我的情況下是f:subView而不是h:form。然後解析客戶端ID,循環遍歷它,每次傳遞一段ID到UIComponent findComponent(UIComponent base, String id, boolean checkId)。所以第一次進入時,這個方法以form3爲id,當前的UIComponent是f:subView,它搜索它的所有facet和children,看看是否有任何組件匹配form3,當然,因爲form3f:subView的父親我的結構。所以null是返回。這是莫哈拉錯誤還是我做錯了一些。我認爲客戶端ID是相對於下一個NamingContainer祖先的,而不是一直到NamingContainer的根目錄?我錯了嗎?

回答

3

在閱讀docs之後,在我看來,Mojarra是對的。

根據文檔,如果您想從樹的根進行「絕對」搜索,則應該在搜索表達式前放置一個分隔符(冒號)。 否則,如果組件是NamingContainer或是NamingContainer的第一個父組件,它將從組件本身執行相對搜索。

順便說一句:我鏈接的文檔看起來與官方文檔分發的規格相同。官方規格是here

+0

它適合我。謝謝。 – 2012-08-10 13:40:09

+0

但是,我覺得'component.getClientId(context);'應該返回帶有':'的客戶端ID。 – 2012-08-10 14:13:08

相關問題