2013-10-02 9 views
6

私は、ユーザーがテーブル自体の行データを編集できるようにするプライムフェイスの機能を使用しようとしています。それ:primefacesの行編集のevent.getObject()は、古い値をBeanに送信します。

http://www.primefaces.org/showcase/ui/datatableRowEditing.jsf

私が編集、ユーザ入力された新しい値がbean.Itに送信されませんが、まだ古い値を示していると言います。

JSFでの私のコード:

<p:dataTable value="#{mybean.userList}" 
     var="item" 
     id="dataTab" 
     widgetVar="usersTable" 
     tableStyleClass="data" paginator="true" rows="5" 
     filteredValue="#{userController.filteredUsers}" 
     editable="true" 
     rowKey="#{item}"> 

    <p:ajax event="rowEdit" listener="#{mybean.onEdit}" update=":userForm:growl" /> 
    <p:ajax event="rowEditCancel" listener="#{mybean.onCancel}" update=":userForm:growl" /> 
    <f:facet name="header"> 
     <p:outputPanel> 
      <h:outputText value="Search all fields:" /> 
      <p:inputText id="globalFilter"  onkeyup="('usersTable').filter()" style="width:150px" /> 
     </p:outputPanel>  
    </f:facet> 


    <p:column sortBy="#{item.firstName}" filterBy="#{item.firstName}" 
     filterMatchMode="startsWith"> 
     <p:cellEditor> 
      <f:facet name="header"> 
       <h:outputText value="First Name" /> 
      </f:facet> 
      <f:facet name="output"> 
       <h:outputText value="#{item.firstName}" /> 
      </f:facet> 
      <f:facet name="input"> 
       <p:inputText value="#{item.firstName}" style="width:100%"/> 
      </f:facet> 
     </p:cellEditor> 
    </p:column> 
    <p:column sortBy="#{item.lastName}" filterBy="#{item.lastName}" filterMatchMode="startsWith"> 
     <p:cellEditor> 
      <f:facet name="header"> 
       <h:outputText value="Last Name" /> 
      </f:facet> 

      <p:column headerText="Update" style="width:6%"> 
       <p:rowEditor /> 
      </p:column>  


</p:dataTable> 

Bean内の私のコード:UIのリストを取得するための豆で

public String onEdit(RowEditEvent event) { 
    User user=(User)event.getObject()); 
    user.getFirstName(); 
} 

コード:

public List<UserBean> getUsersList(){ 
     List<UserBean> retval = new ArrayList<>();    
     for (Object[] tuple : myFacade.getUserList()) { 
      UserBean ub = new UserBean(); 
      ub.setFirstName((String) tuple[0]); 
      ub.setLastName((String)tuple[1]); 
      ub.setEmailAddress((String)tuple[2]); 
      ub.setOfficeNumber((String)tuple[3]); 
      ub.setRole((String)tuple[4]);     
      retval.add(ub); 
     } 
     return retval; 
    } 

私が試してみましたがいくつかのポストで与えられた提案はうまくいきませんでした。誰でも私に新しい値を得る方法を教えてもらえますか?私はgラスフィッシュ4.0、プライムフェイス3.5。

+0

その他の可能性のある問題の中で、コードがJSFタグを適切に閉じることができません。これはコピー&ペーストの問題でしたか? – patstuart

+0

は、変換/検証のように聞こえませんでした。それを確認するためにフォームにメッセージコンポーネントを追加できますか? – kolossus

+0

@patstuartはいこれは単なるコピーの貼り付けエラーで、私のjsfページで問題ありません。 – Valla

答えて

8

私は問題を理解することができました。ゲッターメソッドでリストを取得するたびに、データをロードするためにデータベースを呼び出しています。しかし、これはリストがnullの場合にのみ行う必要があります。次のコードは、あなたに鮮明な画像与えます:だからgetUsersListがpでVARの私の値である

public List<UserBean> getUsersList(){ 


     if(retval == null) 
     { 
      retval = new ArrayList<>(); 

      for (Object[] tuple : myFacade.getUserList()) { 
      UserBean ub = new UserBean(); 
      ub.setFirstName((String) tuple[0]); 
      ub.setLastName((String)tuple[1]); 
      ub.setEmailAddress((String)tuple[2]); 
      ub.setOfficeNumber((String)tuple[3]); 
      ub.setRole((String)tuple[4]); 

      retval.add(ub); 
     } 
     } 
     return retval; 
    } 

を:それがnullの場合のDataTableと私はのonEditを呼び出すときに、今ではリストをチェックすることは、データベースの呼び出しを行いますか、データベースを呼び出しません。

+0

私は同じ問題を抱えていましたが、これは正解です。ありがとう! – akelec

+2

getterでbussinessロジックを実行することはお勧めできません。代わりに、 'f:viewAction'のように、あなたのBeanを初期化するためにいくつかのメソッドを使用してください。 –

関連する問題