2011-07-05 31 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> 

私は例外を取得:どちらも動作しませんでしたIDにインデックスを追加しようとしました

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

<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に行インデックスが付加されます)。したがって、ID outer_panelのコンポーネントは、動作させるために<ui:repeat>の内部になければなりません。しかし、outer_panelであり、実際にはの外側です。

相対クライアントIDの代わりに絶対クライアントIDを指定する必要があります。それを絶対にするには(基本的にはビューのルートからスキャンするように)、クライアントIDの前に:という接頭辞を付けます。あなたは、あなたが

代わり
<f:ajax render=":form_id:outer_panel" /> 

を使用している必要があり、<h:form>prependId="false"を使用しなかった場合については

<f:ajax render=":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

関連する問題