【问题标题】:JSF2 - Pop up table using p:dialog reload and closes once a function is calledJSF2 - 使用 p:dialog 重新加载弹出表并在调用函数后关闭
【发布时间】:2025-12-17 23:50:01
【问题描述】:

我是 JSF2 的新手。 我正在尝试使用 p:dialog 显示表格。 该表具有项目列表,并且在行尾具有此删除功能。我的问题是当它单击删除时,整个页面重新加载并且我的弹出表关闭。 但是,当它不在 p:dialog 中时,删除功能可以正常工作。 我的 bean,无论是视图还是会话范围,都会产生相同的输出。

这是我的 bean 中的删除代码

public String delete(Items items) {

    getItemList.remove(items);
    return null;
}

截取我的 xhtml,

<p:dialog header="Item Table" widgetVar="popUpTbl" modal="true" >
        <h:form>
            <p:dataTable style="width:800px;height:485px;" id="popUpTbl" var="item" value="#{myBean.itemList}" >
                <p:column headerText="Item A">
                    <h:outputText value="#{item.itemA}" />
                </p:column>
                <p:column headerText="Item B">
                    <h:outputText value="#{item.itemB}" />                        
                </p:column>
                <p:column headerText="Action">
                    <h:commandLink value="Delete" action="#{myBean.delete(item)}" />
                </p:column>
            </p:dataTable>                
        </h:form>
    </p:dialog>

【问题讨论】:

  • &lt;h:form&gt;&lt;p:dialog&gt; 中添加 id 并通过提供完全限定名称来更新表单,在这种情况下只是 :dialogId:formId 并从 &lt;h:commandLink&gt; 更新它

标签: java primefaces xhtml


【解决方案1】:

&lt;h:form&gt;&lt;p:dialog&gt; 中添加 id 并通过提供完全限定名称来更新表单,在这种情况下是 :dialogId:formId 并从 &lt;h:commandLink&gt; 更新它,还有一件事我注意到你的对话框 widgetVar 和数据表的 id 相同,这是我在下面的示例中更正的错误

 <p:dialog id="dialogId" header="Item Table" widgetVar="dialogIdWidget" modal="true" >
     <h:form id=formId>
        <p:dataTable style="width:800px;height:485px;" id="popUpTbl" 
            var="item" value="#{myBean.itemList}" >
                    .
                    .
                    .
                    <p:column headerText="Action">
                        <h:commandLink value="Delete" action="#{myBean.delete(item)}" update=":dialogId:formId" />
                    </p:column>
                </p:dataTable>                
            </h:form>
        </p:dialog>

【讨论】:

  • 我采纳了你的建议,但它仍然是一样的,整个页面加载导致对话框关闭,而它应该只加载它自己的对话框。
  • 在您的actionListener 中使用&lt;h:commandLink&gt; 并且仅用于测试目的使用commandButton 我认为它应该可以工作并且您是否从commandLink 更新因为我忘记在@987654331 中写update @,无论如何我更新了我的答案,看看它并尝试。
  • 我得到一个错误,更新属性没有定义。
【解决方案2】:

h:commandLink makes 一个完整的帖子并重新加载整个页面,你想使用 p:commandLink 默认使用的 ajax。

试试

<p:commandLink value="Delete" process="@this" update="@form" action="#{myBean.delete(item)}" />

process="@this" 因为p:commandLink 默认处理整个表单(您不需要),update="@form" 因为您需要使用 bean 数据(或至少是数据表,但是这与您的情况相同)。

您本可以保留h:commandLink 并完成like here,但它构建在 p:commandLink 中。

【讨论】:

  • @Jaqen H'ghar 如果我给update="form" 是不是会更新页面中存在的所有表单?或者只有对话表单会更新我认为如果我们提供完全限定的表单名称,那将是更好的解决方案,不是吗?
  • 它将(应该)只更新 commandLink 所在的表单