JSF 2.0 更新 primefaces 对话框第一次不起作用

Posted

技术标签:

【中文标题】JSF 2.0 更新 primefaces 对话框第一次不起作用【英文标题】:JSF 2.0 Update a primefaces dialog not working the first time 【发布时间】:2011-10-13 01:46:43 【问题描述】:

我有一个要求用户输入文本的简单表单。然后,当用户单击链接时,将显示一个对话框,其中包含用户输入的值。我遇到的第一个问题是对话框没有显示。

另一个问题与更新有关。第一次显示表单时,html代码正确,#dialogBean.location的当前值为空。

然后我点击链接,HTML 代码“错误”。这就是为什么我猜它没有显示:

<form id="dialogForm" name="dialogForm" method="post" action="/tcmt-component/dialog.xhtml" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="dialogForm" value="dialogForm">
<input type="hidden" autocomplete="off" value="-6424900608015567042:-9068630845666043913" id="javax.faces.ViewState" name="javax.faces.ViewState"></form>

同时,我检查了 Ajax 调用的返回。 #dialogBean.location 的值还是空的。

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><changes><update id="dialogForm:dialog"><![CDATA[<div id="dialogForm:dialog" style="display:none" title="Dialog">  
        Current Location:

我再次点击链接,这次#dialogBean.location 的值被设置为正确的值。

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><changes><update id="dialogForm:dialog"><![CDATA[<div id="dialogForm:dialog" style="display:none" title="Dialog">  
        Current Location: MyLocation

豆子:

@ManagedBean
@SessionScoped
public class DialogBean implements Serializable 

    private String location;

    public void setLocation(String location) 
        this.location = location;
    

    public String getLocation() 
        return location;
    


观点:

<?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:f="http://java.sun.com/jsf/core"      
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui">

  <h:head> 
  </h:head>
    <h:body>
        <h:form id="initForm">

        <h:inputText id="location" value="#dialogBean.location" />
        <p:commandLink update="dialogForm:dialog" onclick="dlg.show()">  
            <h:outputText value="Show Dialog" />  
        </p:commandLink>

        </h:form>  

        <h:form id="dialogForm">
        <p:dialog id="dialog" header="Dialog" widgetVar="dlg" resizable="false">  
        Current Location: <h:outputText value="#dialogBean.location" />
        <p:commandButton value="Close" oncomplete="dlg.hide();"/>
        </p:dialog>
        </h:form>  
    </h:body>
</html>

解决方案

这似乎是更新对话框的 primefaces 问题。相反,我将对话框包装在一个面板中并且更新工作:

<p:dialog header="Dialog" widgetVar="dlg" resizable="false">  
<p:outputPanel id="dialogPanel">
Current Location: <h:outputText value="#dialogBean.location" />
    <h:form id="dialogForm">
<p:commandButton value="Close" oncomplete="dlg.hide();"/>
</h:form>  
</p:outputPanel>
</p:dialog>

<h:form id="initForm">
<h:inputText id="location" value="#dialogBean.location" />
<p:commandLink update="dialogPanel" onclick="dlg.show()">  
    <h:outputText value="Show Dialog" />  
</p:commandLink>
</h:form>

【问题讨论】:

+1 - 我今天在使用 PrimeFaces 3.0-M3-SNAPSHOT 时遇到了同样的问题,最后我在 &lt;p:dialog&gt; 中使用了相同的解决方案 &lt;p:outputPanel&gt; 作为 Ajax PPR 目标。太糟糕了,我没有早点找到您的解决方案,否则我可以节省一些时间和精力! :) 【参考方案1】:

尝试将 dialog 放在 commandLink 之前,如下所示:

  <p:outputPanel id="panel">
       <h:form id="dialogForm">
           <p:dialog id="dialog" header="Dialog" widgetVar="dlg" resizable="false">  
           Current Location: <h:outputText value="#dialogBean.location" />
           <p:commandButton value="Close" oncomplete="dlg.hide();"/>
           </p:dialog>
       </h:form>  
 </p:outputPanel>
     <h:form id="initForm">
    <h:inputText id="location" value="#dialogBean.location" />
    <p:commandLink update="dialogForm:dialog" onclick="dlg.show()" update="panel">  
        <h:outputText value="Show Dialog" />  
    </p:commandLink>
    </h:form>

另一个简单的解决方案是:如果您使用 Primefaces 3.0(或更高版本),您可以将 dymaic 属性添加到对话框。将其设置为 true。 这是 primefaces 3.2 的VDL 动态模式允许对话框在显示之前而不是在页面加载时获取它的内容,这对于减少初始页面加载时间很有用。默认为假。

【讨论】:

第一次修复对话框的更新。但是对话框仍然没有出现。在日志INFO: Cannot find component with identifier "dialogForm:dialog" in view。所以我尝试了:dialogForm:dialog,它删除了 INFO 日志,但问题仍然存在。如果我输入dialog,对话框会显示,但它没有更新,并且我有 INFO 日志:INFO: Cannot find component with identifier "dialog" in view. 更新面板而不是对话框可以解决问题。感谢您的帮助。 你不应该使用更新属性。因为当你使用 dlg.show() 时,对话框将被更新。 只有在设置为dynamic=true时,对话框才会更新显示。 falsarella:是的,你是对的。自 Primefaces 版本(3.0)以来添加了动态属性。【参考方案2】:

最近几天我一直遇到这个问题,在阅读了这篇文章后,我刚刚通过从panelGrid|outputPanel 中删除'layout="block"' 解决了我的问题。我的 CRUD 表单页面中嵌入了 update="pageContentPanel",现在这个 AJAX PPR 运行得更好。我猜 AJAX PPR(和 PrimeFaces 3.0 M3)与 span 标签的效果比div 标签效果更好。 :(

    <ui:define name="pageContent">

        <p:outputPanel id="pageContentPanel">

            <p:outputPanel layout="block" rendered="#pageNavigationController.isPageSelected('/pageContent_blank.xhtml')">
                <ui:include src="/pageContent_blank.xhtml"/>
            </p:outputPanel>

            <p:outputPanel layout="block" rendered="#pageNavigationController.isPageSelected('/service/pf_Add.xhtml')">
                <ui:include src="/service/pf_Add.xhtml"/>
            </p:outputPanel>

            <p:outputPanel layout="block" rendered="#pageNavigationController.isPageSelected('/service/pf_Browse.xhtml')">
                <ui:include src="/service/pf_Browse.xhtml"/>
            </p:outputPanel>

            <p:outputPanel layout="block" rendered="#pageNavigationController.isPageSelected('/service/pf_Edit.xhtml')">
                <ui:include src="/service/pf_Edit.xhtml"/>
            </p:outputPanel>

            <p:outputPanel layout="block" rendered="#pageNavigationController.isPageSelected('/service/pf_View.xhtml')">
                <ui:include src="/service/pf_View.xhtml"/>
            </p:outputPanel>

        </p:outputPanel>

    </ui:define>

【讨论】:

以上是关于JSF 2.0 更新 primefaces 对话框第一次不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 PrimeFaces 3.4 JSF 2.0 中按 id 查找组件

使用 JSF 2.0 和 Primefaces 设置项目

Spring Security + JSF 2.0 + Primefaces + Hibernate 配置

关于 JSF 2.0 自定义组件和 Primefaces 的帮助

JSF:将页面动态包含到primefaces对话框中

将数据从对话框添加到datable-jsf-primefaces