2012-03-01 6 views
2

jsf + richfacesを使用して粗い機能を実装していたので、この状況に遭遇しました。テーブルがレンダリングされないとreRenderはどのように振る舞うのですか?

私はテキストフィールドとrich:dataTableをフォーム内に持っています。 textFieldの値が変更されると、テーブルデータが読み込まれ、テーブルは最新のデータで再レンダリングされることになっています。

問題点:dataTableの条件をレンダリングして、値リストが空ではない場合はこのテーブルを表示するとどうなりますか?ですから、最初に画面が表示されるとき、listはnull /空であり、テーブルはレンダリングされません。また、textFieldを変更すると、値が取り込まれ、テーブルのreRenderが起動されますが、テーブル全体が存在しません。

この問題を解決する方法はありますか?私はページをリロードした場合、はいテーブルは間違いなく表示されます:)

をここでは、このためのサンプルコードです:

<h:form id="userSearchForm" prependId="false"> 
     <h:inputText value="#{ldapSearch.searchString}"> 
      <a4j:support event="onkeyup" ignoreDupResponses="true" ajaxSingle="true" reRender="usersTable" 
      requestDelay="50" actionListener="#{ldapSearch.searchUser}"/> 
     </h:inputText> 
      <rich:dataTable id="usersTable" 
       rendered="#{not empty ldapSearch.users}" 
       value="#{ldapSearch.users}" var="user"> 
       <rich:column sortable="false" label="Name"> 
        <f:facet name="header"> 
         <h:outputText value="Name"/> 
        </f:facet> 
        <h:outputText title="#{user.displayName}" value="#{user.displayName}"/> 
       </rich:column> 
      </rich:dataTable> 
    </h:form> 
+0

関連:http://stackoverflow.com/questions/9010734/why-do-i-need-to-nest-a-component-with-rendered-some-in-another-component-w – BalusC

答えて

4

私は常にレンダリングされるいくつかのコンポーネントとのdataTableを囲むことで、この問題を解決し、その後、再レンダリング代わりにそのコンポーネント。例:

<h:form id="userSearchForm" prependId="false"> 
    <h:inputText value="#{ldapSearch.searchString}"> 
     <a4j:support event="onkeyup" ignoreDupResponses="true" ajaxSingle="true" reRender="divUsersTable" 
     requestDelay="50" actionListener="#{ldapSearch.searchUser}"/> 
    </h:inputText> 
    <s:div id="divUsersTable"> 
     <rich:dataTable id="usersTable" 
      rendered="#{not empty ldapSearch.users}" 
      value="#{ldapSearch.users}" var="user"> 
      <rich:column sortable="false" label="Name"> 
       <f:facet name="header"> 
        <h:outputText value="Name"/> 
       </f:facet> 
       <h:outputText title="#{user.displayName}" value="#{user.displayName}"/> 
      </rich:column> 
     </rich:dataTable> 
    </s:div> 
</h:form> 
+0

よ、私それを行うか、フォーム全体をレンダリングすることができます。しかし、私はこのような状況を把握して理解するのは難しいです。 – Satya

+0

@Satyaしかし、これはこの種のタスクの典型的な解決策です。このアプローチでは理解しにくいものは何ですか? –

+1

@SatyaあなたがreRenderingしている要素のidがページに存在しなければならないことを覚えておく必要があります。レンダリングしているIDが条件付きでレンダリングされている場合は、ページ上に存在する場合と存在しない場合があります。コンポーネントが以前にレンダリングされていない場合は、再レンダリングされません。 –

0

問題は、最初にレンダリングされていないものを再レンダリングできないことです。私の解決策は、コンポーネントスタイルの表示属性を使用して再生することです。

<rich:dataTable id="usersTable" 
    style="display:#{not empty ldapSearch.users? 'inline' : 'none'}"  
    value="#{ldapSearch.users}" var="user"> 
<!-- your columns --> 
</rich:dataTable> 

こうして、問題なくテーブルを再レンダリングすることができます:)。