【问题标题】:Primefaces - how to update dynamic a .xhtml form from another formPrimefaces - 如何从另一个表单更新动态 .xhtml 表单
【发布时间】:2023-03-05 09:09:02
【问题描述】:

当我单击用于取消请求的链接时,我希望我的表单包含带有 commandLink 的表单以动态更新(因为此记录不应再在此表单中可见)。这是我的代码:

<h:form id = "form">
        <p:dataGrid id = "dataGrid" value="#{userRequestBean.userActiveRequests}" columns="1"
            var="userActiveRequest" selection="#{userRequestBean.request}"
            rowKey="#{userActiveRequest.id}">
            <f:facet name="header">
            My requests
        </f:facet>

            <h:panelGrid id="panelGrid">
                <h:outputText value="#{userActiveRequest.title.toUpperCase()}" />
                <h:outputText value="#{userActiveRequest.description}" />

                <h:form rendered="#{not empty userActiveRequest.hiredAgency}">
                    <h:commandLink
                        value="Details for agency #{userActiveRequest.hiredAgency.tUser.name}"
                        action="agencyDetail?faces-redirect=true">
                        <f:setPropertyActionListener target="#{agencyBean.tAgency}"
                            value="${userActiveRequest.hiredAgency}" />
                    </h:commandLink>
                </h:form>
**//HERE IS THE COMMANDLINK WHICH I MENTIONED**
                <h:form rendered="#{empty userActiveRequest.hiredAgency}">
                    To cancel, click <p:commandLink
                        value="HERE" action="#{userRequestBean.cancelRequest()}"
                        update = "form:dataGrid:panelGrid">
                        <f:setPropertyActionListener target="#{userRequestBean.request}"
                            value="${userActiveRequest}" />
                    </p:commandLink>
                </h:form>

                <p:commandButton value="Details"
                    action="userRequestDetails?faces-redirect=true">
                    <f:setPropertyActionListener target="#{userRequestBean.request}"
                        value="${userActiveRequest}" />
                </p:commandButton>
            </h:panelGrid>
        </p:dataGrid>
    </h:form>

添加: Java类的一部分:

private List<TRequest> userActiveRequests; // + get and set methods

    public UserRequestBean(){
        EntityManager em = HibernateUtil.getEntityManager();
        Query query = em.createQuery("select r " +
                "from TUser u join u.userRequests r where u.id = :userId and r.isActive = 'Y'");
        query.setParameter("userId", Long.valueOf(11));
        userActiveRequests = query.getResultList();
    }

    public void cancelRequest (){
        EntityManager em = HibernateUtil.getEntityManager();
        em.getTransaction().begin();
        request.setIsCancelled(true);
        request.setIsActive(false);
        em.merge(request);
        em.getTransaction().commit();
        //remove the object from the List
        userActiveRequests.remove(request);
    }

【问题讨论】:

  • 问题是您在嵌套表单,这是无效的 HTML。删除包裹您的其他&lt;h:form&gt;s 的&lt;h:form&gt;,然后将调用命令链接操作。
  • 我删除了外部
    但它仍然给了我错误 - 找不到从“dataGrid:0:j_idt19:j_idt21”引用的表达式“dataGrid:panelGrid”的组件。
  • 所以你现在真正的问题是你正在尝试更新一个 id 无法识别的组件。为所有组件指定一个特定 ID,然后更新完整的组件 ID。在这种情况下,删除顶部的&lt;h:form&gt; 后,您的&lt;p.panelGrid id="panelGrid&gt;" 的完整组件ID 将是":dataGrid:panelGrid"
  • 现在,没有发生错误,但我取消的记录仍在dataGrid中。似乎更新不起作用,它不会重新刷新dataGrid。
  • 链接是删除操作还是应该更新数据库状态的操作?您确定还要更新存储在您的List 中的对象吗?

标签: forms jsf jsf-2 primefaces


【解决方案1】:

正如 Luiggi 所说 - 嵌套表单无效。

在 SO 上参考这个: Can you nest html forms? 看看你的设计,看看你是否真的需要嵌套那个内部表单,或者可以只使用部分 ajax 更新来满足你的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多