【问题标题】:custom validation and component reset自定义验证和组件重置
【发布时间】:2012-01-25 15:00:22
【问题描述】:

编辑:我有这个 sn-p 代码:

<h:inputText id="email_id" value="#{CreateUserManager.email}" 
        styleClass="#{CreateUserManager.emailPrimariaValid ? '' : 'inputErrorClass'}">
    <f:validator validatorId="EmailValidator" />
    <a4j:support event="onblur" reRender="email_id, messages" oncomplete="setAnchor();"                         
        status="status4divCoverAll" ajaxSingle="true" />
</h:inputText>

这是托管会话 bean:

public class CreateUserManager {
...
protected boolean emailPrimariaValid;

public CreateUserManager() {
    ...
    this.emailPrimariaValid = true;
}


public boolean isEmailPrimariaValid() {
    FacesContext context = FacesContext.getCurrentInstance();
    UIInput input = (UIInput)context.getViewRoot().findComponent(":createUser:email_id");
    return input.isValid();
}

public void setEmailPrimariaValid(boolean emailPrimariaValid) {
    this.emailPrimariaValid = emailPrimariaValid;
}

}

请记住,如果我来自另一个页面(url),我会从会话中删除这个 bean,因此 bean 会再次执行构造函数。

问题:我写了一封无效的电子邮件,它正确地将类设置为 inputErrorClass,但是如果我转到另一个页面(因此输入组件仍然无效)然后返回第一个页面,该类仍然是 inputErrorClass .

【问题讨论】:

  • 这真的是一个“会话 bean”,就像在 EJB 中一样?还是您的意思是“会话范围的托管 bean”?看不到注释,很难分辨。
  • 它是一个会话范围的托管bean,jsf版本是1.2
  • 你做了什么调试?当您返回页面时,isEmailPrimariaValid() 是否返回 true?
  • 当我返回该方法返回 false 时,它​​似乎以某种方式存储了组件的无效状态,尽管我从会话中删除了托管 bean!

标签: jsf richfaces


【解决方案1】:

您是否有机会使用 Seam?它具有一些很好的功能,可以在出现错误时设置输入元素的样式。

在Seam 2中,您可以使用&lt;s:decorate&gt;标签:http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/controls.html#d0e28688

在 Seam 3 中,您可以使用 UIInputContainer 和一个复合组件:http://jerryorr.blogspot.com/2011/10/replacement-for-sdecorate-in-seam-3.html

如果您不使用 Seam...好吧,您可以查看 Seam 源代码以了解他们做了什么!

【讨论】:

  • 我不使用seam,我认为阅读他们的源代码可能会更困难。我“只是”需要重新初始化验证器修改的组件状态。
  • 我不认为手动修改组件的 styleClass 属性是要走的路,那么。请参阅下面提供的链接@dcernahoschi,了解仅限 JSF 的方法。
【解决方案2】:

【讨论】:

  • 我尝试了这种方法,但问题仍然存在......当我更改页面然后返回第一个时,输入组件仍然有错误类。我想我必须(在构造函数中)将 input.isValid 初始化为 true,但我不知道怎么做!在该阶段无法访问 viewRoot。
  • 我建议发布更多代码,例如 SessionBean 和 .xhtml 中的相关部分(现在您已经添加了 isValid 检查)。
猜你喜欢
  • 2019-07-04
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多