2012-02-10 75 views
2

我想弄明白,primefaces單元格編輯器是如何工作的。爲什麼這張表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 2012-02-10 17:03:26

+0

@BalusC當我單擊時編輯器會自動激活,但是當我單擊確認時,UI中的值不會更改,並且我看不到數據庫中的更改。這是我使用的組件:http://www.primefaces.org/showcase-labs/ui/datatableEditing.jsf – sfrj 2012-02-10 18:11:46

回答

2

但是當我點擊comfirm,UI中的值不會改變

你已經綁定的值<p:dataTable>retrieve()而不是getSubjects()。所以每一個getter調用都會直接從數據庫中獲取值,而不是模型。

,我看到的你是不是保存在數據庫中的任何數據庫

沒有變化。

修復控制器,如下所示:

@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; 
    } 

} 

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

使用DataModel<Subject>代替List<Subject>是必要的,以便能夠獲取當前行。

+0

我明白我的錯誤,我按照你所說的解決了問題,但我有一個疑問,與我打電話保存的方式有關。 我的表單沒有p:commandButton,它使用'',我怎樣觸發'save()'方法? – sfrj 2012-02-10 20:28:24

+0

如答案所示,添加一個保存按鈕,該按鈕應該保存在行編輯過程中所做的所有更改。 – BalusC 2012-02-10 20:29:12

+0

或者如果你不想保存按鈕,你可以在數據表中使用''。 – BalusC 2012-02-10 20:38:39