2011-07-05 75 views
2

我正在嘗試render祖父組件。 代碼:ui中的組件ID:重複問題

<h:form prependId="false> 
<h:panelGroup id="outer_panel"> 
    <ui:repeat var="curr" value="#{bean.map}"> 
     <h:panelGroup id="inner_panel"> 
      <h:commandButton value="Remove" action="actionThing" > 
       <f:ajax render="outer_panel" /> 
      </h:commandButton> 
     </h:panelGroup> 
    </ui:repeat> 
</h:panelGroup> 
</h:form> 

我得到一個異常:

javax.faces.FacesException: Component with id:outer_panel not found 

試圖將索引添加到ID,沒有工作也不:

<h:form prependId="false> 
<h:panelGroup id="outer_panel"> 
    <ui:repeat var="curr" value="#{bean.map}" varStatus="loop"> 
     <h:panelGroup id="inner_panel"> 
      <h:commandButton value="Remove" action="actionThing" > 
       <f:ajax render="#{loop.index+1}:outer_panel" /> 
      </h:commandButton> 
     </h:panelGroup> 
    </ui:repeat> 
</h:panelGroup> 
</h:form> 

任何想法,爲什麼ID找不到?

謝謝。

回答

3

找不到,因爲您在render屬性中使用了相對客戶端ID。它變得相對於最接近的父母naming container組件。在這種情況下,這是<ui:repeat>(它預先生成具有行索引的子級生成的客戶機ID)。因此,編號爲outer_panel的組件必須位於<ui:repeat>之內才能使其正常工作。但是,outer_panel實際上是以外。

您需要指定絕對客戶端ID而不是相對客戶端ID。爲了使其絕對(使其基本上從視圖中掃描),請在:前加上客戶端ID。

<f:ajax render=":outer_panel" /> 

對於你沒有在<h:form>使用prependId="false"的話,那麼你應該使用

<f:ajax render=":form_id:outer_panel" /> 

代替。

+0

會,'inner_panel'被引用爲':outer_panel:inner:panel'或'inner_panel'?我在問,因爲在實踐中,'out_panel'包含在其他'h:panelGroup'中。另外,在打印'outer_panel'的id(使用'#{component.clientId}')時,我得到'j_id594943238_6609e93f:0:outer_panel'(正如你所假設的那樣,還有其他''組件包含'outer_panel'。也許我應該早些提到這個...... – Ben

+0

它與''在同一個父命名容器中,所以只需'render =「inner_panel」'應該這樣做。 – BalusC