裏面我有一個看起來遵循的有效身份證鑽嘴魚科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
,當然,因爲form3
是f:subView
的父親我的結構。所以null
是返回。這是莫哈拉錯誤還是我做錯了一些。我認爲客戶端ID是相對於下一個NamingContainer祖先的,而不是一直到NamingContainer的根目錄?我錯了嗎?
它適合我。謝謝。 – 2012-08-10 13:40:09
但是,我覺得'component.getClientId(context);'應該返回帶有':'的客戶端ID。 – 2012-08-10 14:13:08