2014-02-21 42 views
1

我想用弹出对话框编写一个JSF页面,允许用户输入数据。我之前使用过PrimeFaces,但由于各种原因,我决定不将它用于此项目。毕竟,我只需要一个简单的弹出式对话框。自己编码有多难?inputHidden不立即更新ajax动作

假设工作的方式是:

  1. 用户点击添加新记录按钮,并所示的对话框。
  2. 用户输入数据并单击保存按钮。
  3. 如果存在验证错误,则消息显示在对话框中,并且对话框保持可见状态。
  4. 如果没有错误,主页上将显示成功消息,对话框消失。
  5. 用户可以按下取消按钮关闭对话框而不保存。

我的问题是,当用户按下保存并获取验证错误,然后按下取消,对话框不会消失。我可以看到,在这种情况下,inputHidden字段的值而不是被更新为false。后台bean上的isShowDialog()方法确实调用了而不是

这里是我的facelet:

<?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"> 
<h:head> 
    <h:outputScript library="js" name="jquery-1.11.0.js" /> 
</h:head> 
<h:body> 
    <h:messages id="pageMessages" errorStyle="color: red;" infoStyle="color: green;" /> 

    <script type="text/javascript"> 
     function showHideDialog(data) { 
      if (data.status == "success") { 
       if ($("#dialogForm\\:showDialog").val() == "true") { 
        $("#dialogDiv").show(); 
        $("#pageMessages").hide(); 
       } else { 
        $("#dialogDiv").hide(); 
        $("#pageMessages").show(); 
       } 
      } 
     } 
    </script> 
    <div id="dialogDiv" style="border: thick solid black; display: none;"> 
     <h:form id="dialogForm"> 
      <h:messages id="dialogMessages" errorStyle="color: red;" infoStyle="color: green;" /> 
      <h:inputHidden id="showDialog" value="#{backingBean.showDialog}" /> 
      <h:panelGrid columns="2"> 
       <h:outputLabel for="dialogField" value="Some Field:" /> 
       <h:inputText id="dialogField" value="#{backingBean.dialogField}" label="Some field" required="true" /> 
      </h:panelGrid> 
      <h:commandButton value="Save" action="#{backingBean.save}"> 
       <f:ajax event="action" execute=":dialogForm" render=":dialogForm :pageMessages" onevent="showHideDialog" /> 
      </h:commandButton> 
      <h:commandButton value="Cancel" action="#{backingBean.cancel}" immediate="true"> 
       <f:ajax event="action" render=":dialogForm :pageMessages" onevent="showHideDialog" /> 
      </h:commandButton> 
     </h:form> 
    </div> 

    <h:form id="pageForm"> 
     <p>Normal page content. Blah, blah, blah.</p> 
     <h:commandButton value="Add New Record" action="#{backingBean.addNew}"> 
      <f:ajax event="action" render=":dialogForm :pageMessages" onevent="showHideDialog" /> 
     </h:commandButton> 
    </h:form> 
</h:body> 
</html> 

这是我支持bean:

package com.mycompany.example; 

import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 
import javax.faces.context.FacesContext; 

@ManagedBean 
@ViewScoped 
public class BackingBean { 
    private String dialogField; 
    private boolean showDialog = false; 

    public String addNew() { 
     dialogField = null; 
     showDialog = true; 
     return null; 
    } 

    public String save() { 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "New row successfully saved.", null)); 
     showDialog = false; 
     return null; 
    } 

    public String cancel() { 
     showDialog = false; 
     return null; 
    } 

    public String getDialogField() { return dialogField; } 
    public void setDialogField(String dialogField) { this.dialogField = dialogField; } 
    public boolean isShowDialog() { return showDialog; } 
    public void setShowDialog(boolean showDialog) { this.showDialog = showDialog; } 
} 

如果它的事项,我使用的钻嘴鱼科2.2.5和Tomcat 7.0.42。

任何建议或见解,将不胜感激。

回答

2

我发现回答。我改变

<h:inputHidden id="showDialog" value="#{backingBean.showDialog}" /> 

<input id="dialogForm:showDialog" type="hidden" value="#{backingBean.showDialog}" /> 
0

我找到了答案阅读下列BalusC文章:Okay, when should I use the immediate attribute?

总之,使用

<h:inputHidden id="showDialog"immediate="true"

execute="showDialog"<f:ajax<h:commandButton value="Cancel"


P.S .:您的示例代码非常有用。

+0

谢谢,但没有奏效。事实上它让事情变得更糟。现在,JSF生命周期在执行取消操作之前从阶段2中的backingBean获取showDialog字段的值(应用请求值)。在更改之前,它获得了阶段6(渲染响应)中的值,这是在取消操作将其设置为false后的值。 –