2012-02-10 16 views
2

私は、素形セル内エディタの仕組みを理解しようとしています。なぜこのテーブルIn-Cellエディタは動作しませんか?

何らかの理由で動作しません。私はそれが活性化しているのを見て、タイプすることもできますが、値は変わりません。何が欠けている?

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:f="http://java.sun.com/jsf/core"> 

    <h:form> 
     <p:dataTable id="allSubjects" var="subject" value="#{subjectControllerUpdate.retrieve()}" paginator="true" rows="7" > 
      <p:column headerText="Name" sortBy="#{subject.name}" style="width:200px" > 
       <p:cellEditor> 
        <f:facet name="output"> 
         <h:outputText value="#{subject.name}"/> 
        </f:facet> 
        <f:facet name="input"> 
         <p:inputText value="#{subject.name}" style="width:100%"/> 
        </f:facet> 
       </p:cellEditor> 
      </p:column> 

      <p:column sortBy="#{subject.description}" headerText="Description">    
       <p:cellEditor> 
        <f:facet name="output"> 
         <h:outputText value="#{subject.description}"/> 
        </f:facet> 
        <f:facet name="input"> 
         <p:inputText value="#{subject.description}" style="width:100%"/> 
        </f:facet> 
       </p:cellEditor>  
      </p:column> 

      <p:column sortBy="#{subject.credits}" headerText="Credits" style="width:50px"> 
       <p:cellEditor> 
        <f:facet name="output"> 
         <h:outputText value="#{subject.credits}"/> 
        </f:facet> 
        <f:facet name="input"> 
         <p:inputText value="#{subject.credits}" style="width:100%"/> 
        </f:facet> 
       </p:cellEditor> 
      </p:column> 

      <p:column headerText="Options" style="width:50px">     
       <p:rowEditor /> 
      </p:column>   
     </p:dataTable> 
    </h:form>  

</html> 

これは、管理対象Bean

package controllers; 

import crudfacades.SubjectFacade; 
import entities.Subject; 
import java.io.Serializable; 
import java.util.List; 
import javax.ejb.EJB; 
import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 

@Named("subjectControllerUpdate") 
@SessionScoped 
public class SubjectControllerUpdate implements Serializable { 

    private List<Subject> subjects; 
    private Subject currentSubject; 
    @EJB 
    private SubjectFacade ejbFacade; 

    //INITIALIZATION 
    public SubjectControllerUpdate() { 
     currentSubject = new Subject(); 
    } 

    //RETRIEVE 
    public List<Subject> retrieve() { 
     return getSubjectFacade().findAll(); 
    } 

    //UPDATE 

    //HELP METHODS 
    //RETURN THE FACADE FOR DATA MANIPULATION(Best practice) 
    private SubjectFacade getSubjectFacade() { 
     return ejbFacade; 
    } 

    //GETTERS AND SETTERS 
    public Subject getCurrentSubject() { 
     return currentSubject; 
    } 

    public void setCurrentSubject(Subject currentSubject) { 
     this.currentSubject = currentSubject; 
    } 

    public List<Subject> getSubjects() { 
     return subjects; 
    } 

    public void setSubjects(List<Subject> subjects) { 
     this.subjects = subjects; 
    } 
} 
+0

"値は変更されません"と正確にはどういう意味ですか? – BalusC

+0

@BalusC私はクリックするとエディタが起動しますが、確認をクリックすると、UIの値は変更されず、データベースに変更はありません。これは私が使用しているコンポーネントです:http://www.primefaces.org/showcase-labs/ui/datatableEditing.jsf – sfrj

答えて

2

ですが、私はかご確認くださいをクリックすると、UIの値は

に変更されていないあなたがの値を束縛しましたgetSubjects()の代わりに<p:dataTable>retrieve()となります。したがって、getter呼び出しごとに、モデルではなくDBから直接値が取得されます。

は、と私はあなたがDBには何も保存されていないデータベース

には変化は見られません。次のように

は、コントローラを修正:

<h:form> 
    <p:dataTable value="#{subjectControllerUpdate.subjects}" ...> 
        <p:ajax event="rowEdit" listener="#{subjectControllerUpdate.save}" /> 
     ... 
    </p:dataTable> 
</h:form> 

@Named 
@SessionScoped 
public class SubjectControllerUpdate implements Serializable { 

    private DataModel<Subject> subjects; 

    @EJB 
    private SubjectFacade ejbFacade; 

    @PostConstruct 
    public void init() { 
     subjects = new ListDataModel<Subject>(ejbFacade.findAll()); 
    } 

    public void save() { 
     ejbFacade.save(subjects.getRowData()); 
    } 

    public List<Subject> getSubjects() { 
     return subjects; 
    } 

} 

DataModel<Subject>代わりにList<Subject>を使用すると、現在の行を取得することができるようにするために必要です。

+0

あなたが言ったように私の間違いを理解していますが、私はあなたがセーブと呼ぶ方法には疑問があります。 。 私のフォームはp:commandButtonを持っておらず、 ''を使っています。どうすれば 'save()'メソッドを起動できますか? – sfrj

+0

答えに示されているように、行の編集中に加えられたすべての変更を保存する保存ボタンを追加します。 – BalusC

+0

保存ボタンが不要な場合は、データテーブル内で 'を使用できます。 – BalusC

関連する問題