为什么这个表格内嵌编辑器不起作用?

发布于 2025-01-04 14:02:20 字数 3827 浏览 1 评论 0原文

我试图弄清楚 primefaces 单元内编辑器是如何工作的。

由于某种原因,它不起作用。我只是看到它激活了,我也可以输入,但值没有改变。缺什么?

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

I am trying to figure out, how the primefaces in-cell editor works.

For some reason, it does not work. I just see it activating and also i can type, but the values do not change. What is missing?

<?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>

This is the managed 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;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月亮是我掰弯的 2025-01-11 14:02:20

但是当我点击确认时,UI 中的值没有改变

您已将 的值绑定到 retrieve()< /code> 而不是 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 而不是 List 是为了能够获取当前行。

but when i click comfirm, the value in the UI is not changed

You've bound the value of the <p:dataTable> to retrieve() instead of getSubjects(). So every single getter call will get the values straight from the DB instead of the model.

and i see no changes in the database

You are not saving anything in the DB.

Fix your controller as follows:

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

}

with

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

Using DataModel<Subject> instead of List<Subject> is necessary in order to be able to get the current row.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文