2011-01-11 118 views
4

好的,在这里你是核心问题。JSF:如何在ajax请求中刷新必填字段

页面。我有两个必需的“输入文本”。 一个命令按钮,用于更改bean值并重新调用“作业”对象。

<a4j:form id="pervForm"> 
    SURNAME:<h:inputText id="surname" label="Surname" value="#{prevManager.surname}" required="true" /> 
    <br/>    
    JOB:<h:inputText value="#{prevManager.job}" id="job" maxlength="10" size="10" label="#{msg.common_label_job}" required="true" /> 
    <br/> 

    <a4j:commandButton value="Set job to Programmer" ajaxSingle="true" reRender="job"> 
     <a4j:actionparam name="jVal" value="Programmer" assignTo="#{prevManager.job}"/> 
    </a4j:commandButton> 

    <h:commandButton id="save" value="save" action="save" class="HATSBUTTON"/> 

</a4j:form> 

这里简单经理:

public class PrevManager 
{ 

    private String surname; 
    private String job; 

    public String getSurname() 
    { 
     return surname; 
    } 

    public void setSurname(String surname) 
    { 
     this.surname = surname; 
    } 

    public String getJob() 
    { 
     return job; 
    } 

    public void setJob(String job) 
    { 
     this.job = job; 
    } 

    public String save() 
    { 
     //do something 
    } 

} 

让我们做到这一点:

上的作业输入文本写的东西(如 “老师”)。 留空姓。 保存。 出现验证错误(姓是强制性的)。 按“将作业设置为程序员”:没有任何反应。

检查bean值,我发现它正确更新,确实页面上的组件没有更新!

那么,根据JBoss的文档,我发现:

阿贾克斯区域是一个关键的Ajax组件。 它会限制部件 树的部分在服务器 一侧发生ajax请求时处理。 处理意味着 解码,验证和型号更新 阶段期间的调用。使用 区域最常见的原因是:

其它形式的输入 不必要对于给定的AJAX请求的 验证期间-avoiding JSF生命周期处理的终止执行; - 定义事件发送的不同策略 (immediate =“true/false”) - 显示ajax状态的单独指示器 - 提高呈现处理的性能 (selfRendered =“true/false”, renderRegionOnly =“真/假”)

下面的两个例子示出了 情况时验证错误并 不允许处理一个Ajax输入。 输入名称。输出文字 组件应该在您之后重新出现。 但是,在第一种情况下,此 活动将由于 其他字段的required =“true”而中止。 当“作业”字段为空时,您将只看到错误消息 。

给您的例子:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:a4j="http://richfaces.org/a4j" 
     xmlns:rich="http://richfaces.org/rich"> 

     <style> 
      .outergridvalidationcolumn { 
       padding: 0px 30px 10px 0px; 
      } 
     </style> 

    <a4j:outputPanel ajaxRendered="true"> 
     <h:messages style="color:red" /> 
    </a4j:outputPanel> 
    <h:panelGrid columns="2" columnClasses="outergridvalidationcolumn"> 

     <h:form id="form1"> 
       <h:panelGrid columns="2"> 
        <h:outputText value="Name" /> 
        <h:inputText value="#{userBean.name}"> 
         <a4j:support event="onkeyup" reRender="outname" /> 
        </h:inputText> 
        <h:outputText value="Job" /> 
        <h:inputText required="true" id="job2" value="#{userBean.job}" /> 
       </h:panelGrid> 
     </h:form> 

     <h:form id="form2"> 
      <h:panelGrid columns="2"> 
       <h:outputText value="Name" /> 
       <a4j:region> 
        <h:inputText value="#{userBean.name}"> 
         <a4j:support event="onkeyup" reRender="outname" /> 
        </h:inputText> 
       </a4j:region> 
       <h:outputText value="Job" /> 
       <h:inputText required="true" id="job1" value="#{userBean.job}" /> 
      </h:panelGrid> 
     </h:form> 

    </h:panelGrid> 
    <h:outputText id="outname" style="font-weight:bold" value="Typed Name: #{userBean.name}" /> 
    <br /> 
</ui:composition> 

Form1中:该行为是不正确。我需要填写这份工作,然后填写姓名。 Form2:行为是正确的。我不需要填写这份工作来查看正确的价值。

不幸的是,使用Ajax区域并没有帮助(事实上我用它糟糕的方式...),因为我的字段都是必需的。这是主要的不同。

有什么想法?

非常感谢。

回答

0

使用a4j:actionparam将设置该值,但在这种情况下无法绕过验证。验证发生在组件上(而不是bean属性)。所以,当你提交时,组件的值仍然是空的。希望这可以帮助。

+0

我不是在无效组件上工作。我只需要改变一个有效的组件的值...我改变了bean的值,我不能强制更新(immediate,reRender,ajaxRegion等等)。我发现的唯一方法是使用process属性。在这种情况下,组件被正确更新,但是如果并且仅当它具有初始值(我的意思是:组件具有非空值)。因此,无法强制... – Tama 2011-01-12 09:18:44

+0

将ajaxSingle =“true”放在按钮上,然后重新渲染输入组件。 – 2011-01-13 00:24:55

0

当你点击“Set job to Programmer”时,没有反应,因为你没有重新编辑你的消息组件。如果你这样做,你将能够看到验证信息。

您需要重新描绘的消息,因为它是一个<a4j:commandButton/>,不是一个简单的<h:commandButton/>

尝试使用道具。 “将作业设置为程序员”按钮中的immediate并检查它是否会更新该字段。

<a4j:commandButton value="Set job to Programmer" ajaxSingle="true" reRender="job" immediate="true"> 
    <a4j:actionparam name="jVal" value="Programmer" assignTo="#{prevManager.job}"/> 
</a4j:commandButton> 

*我使用immediate不认为 “ajaxSingle” 有必要在这里..

也许你可以得到一个新的问题......,这个bean值将不会更新(也许!)。如果发生了,请创建一个手动设置bean值的bean方法。否则,如果bean值已更新且字段仍然为空,请尝试将“job”字段放入<a4j:outputPanel/>,然后重新调用outputPanel。

<a4j:outputPanel id="myPanel"> 
    <h:inputText value="#{prevManager.job}" id="job" maxlength="10" size="10" label="#{msg.common_label_job}" required="true" /> 
</a4j:outputPanel/> 

<a4j:commandButton value="Set job to Programmer" reRender="myPanel" immediate="true"> 
    <a4j:actionparam name="jVal" value="Programmer" assignTo="#{prevManager.job}"/> 
</a4j:commandButton> 

更多信息有关<a4j:outputPanel/>here

3

这个问题在JSF 2还确定并详细此相关答案解释:How can I populate a text field using PrimeFaces AJAX after validation errors occur?

总结,答案是,你需要清除EditableValueHolder组件的状态时,它的大约是AJAX渲染但通过调用方法setValue(null),setSubmittedValue(null),setLocalValueSet(false),setValid(true),不包含在ajax-execute中。注意:在JSF 2中,您应该使用便捷方法resetValue()来代替。

鉴于你的“工作”输入字段的客户ID prevForm:job,这里是你如何清除它与相关的动作监听器方法中的“设置工作,程序员”按钮:

UIInput input = (UIInput) context.getViewRoot().findComponent("prevForm:job"); 
input.setValue(null); 
input.setSubmittedValue(null); 
input.setLocalValueSet(false); 
input.setValid(true);