【问题标题】:Create edit form for Primefaces table为 Primefaces 表创建编辑表单
【发布时间】:2017-07-08 19:37:47
【问题描述】:

我想为 Primefaces 表创建编辑表单。我测试了这段代码:

<h:form id="form">
    <p:dataTable id="tbl" var="systemuser" value="#{systemusers.systemUsers}"                                 
                 selectionMode="single" selection="#{systemusers.selectedSystemUser}" rowKey="#{systemuser.username}" lazy="true"
                 resizableColumns="true"
                 >

        <p:ajax event="rowSelect" listener="#{systemusers.onRowSelect}" update=":form:carDetail" oncomplete="PF('carDialog').show()" />
        ....................
    </p:dataTable>

    <p:dialog id="wd" header="System User Details" widgetVar="carDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="true">
        <p:outputPanel id="carDetail" style="text-align:center;">
            <p:panelGrid  columns="2"  columnClasses="label,value">

                <h:outputLabel for="id" value="ID" />
                <p:outputLabel id="id" value="#{systemusers.selectedSystemUser.id}" rendered="#{not systemusers.editable}"/>
                <h:inputText value="#{systemusers.selectedSystemUser.id}" rendered="#{systemusers.editable}" />
                ........
            </p:panelGrid>
        </p:outputPanel>

        <f:facet name="footer">
            <p:commandButton value="Edit System User" rendered="#{not systemusers.editable}"
                             actionListener="#{systemusers.editRecord(false)}">
                <f:ajax render=":form:wd" execute=":form:wd"></f:ajax>
            </p:commandButton>&nbsp;

            <p:commandButton value="Cancel" rendered="#{systemusers.editable}" actionListener="#{systemusers.editRecord(true)}">
                <f:ajax render=":form" execute=":form"></f:ajax>
            </p:commandButton>
        </f:facet>
    </p:dialog>

    <p:contextMenu for="tbl">
        <p:menuitem value="View" update="carDetail" icon="fa fa-search" oncomplete="PF('carDialog').show()"/>
        <p:menuitem value="Delete" update="tbl" icon="fa fa-remove" actionListener="#{systemusers.deleteSystemUser}">
            <p:confirm header="Confirmation" message="Are you sure?" icon="fa fa-warning" />
        </p:menuitem>
    </p:contextMenu>

    <p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
        <p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="fa fa-check" />
        <p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="fa fa-remove" />
    </p:confirmDialog>
</h:form>

托管 bean:

@Named
@RequestScoped
public class Systemusers implements Serializable
{
.......
public void editRecord(boolean editable)
    {
        SessionFactory factory = HibernateUtils.getSessionFactory();
        Session session = factory.getCurrentSession();

        try
        {
            session.getTransaction().begin();

            SystemUsersModel obj = new SystemUsersModel();
            obj.setId(selectedSystemUser.getId());
            ..........
            session.update(obj);

            session.getTransaction().commit();

            this.editable = editable;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
    }
......
private boolean editable = false;

    public boolean isEditable()
    {
        return editable;
    }

    public void setEditable(boolean editable)
    {
        this.editable = editable;
    }
}

当我打开编辑表单并单击按钮Edit System User 时,表单会消失。可能是因为我渲染并执行它。如何在不关闭表单的情况下执行表单及其下方?

【问题讨论】:

  • 我试过这个 但我得到了相同的结果。你能粘贴一些代码示例吗?
  • 我尝试了您的建议,但对话框再次被隐藏。我在对话框中添加了表单,我现在设法解决了这个问题。目前我正面临这个问题:Java Object value="#{systemusers.selectedSystemUser.id}" 为空然后我按下编辑按钮。知道如何解决这个问题吗?
  • 这里要注意一下,最好有一个专用的 h:form 用于对话框和一个用于表格,尝试用一个新的包装 p:dialog 的 内容 h:form 并让您的 dataTable 使用旧的 h:form,这可能会导致您修复任何错误的执行或处理问题。
  • 为什么不把对话弄出来?!?
  • @YagamiLight 你能给我看一个工作的例子吗?

标签: jsf primefaces jsf-2


【解决方案1】:

示例代码在多个方面都不好。有两件事很突出:

  • 它不是 [mcve]
  • &lt;f:ajax render=":form" execute=":form"&gt; 是多余的,甚至可能导致奇怪的行为

OP 很可能不知道(引用自 PrimeFaces showcase ,强调我的)

命令按钮

CommandButton 扩展了标准的 h:commandButton带有 ajax、部分处理和换肤功能。

所以 commandBotton 已经启用了 ajax 并且 不需要 拥有一个

<f:ajax render=":form" execute=":form">

在里面。这(很可能)使更新运行两次。一个@none (Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes) 和一个更新表单。第二个很可能没有任何内容。但是尝试(和调试)会让事情变得清晰。如果这不是答案,则在代码中看不到原因,因此应该是 [mcve]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2013-05-05
    • 1970-01-01
    相关资源
    最近更新 更多