2012-02-10 54 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