ajax - 通过ajax禁用验证器

标签 ajax jsf validation

我有一个简单的请求范围实体/pojo,它有一个枚举和一个字符串作为属性。

public Enum Type
{
    None,
    Email,
    Fax;
}

@ManagedBean(name = "testEntity")
@RequestScoped
public class TestEntity
{
    private Type type; //Default = None
    private String address;

    //getter and setter
}

此枚举有一个“电子邮件”字段,用于标识具有相关地址的电子邮件地址。
在 JSF 中,我现在想要启用/禁用关于 SelectOneMenu 中当前所选类型的地址 InputText 字段的验证器。

<h:form id="formId">
    <p:selectOneMenu id="type" value="#{testEntity.type}>
        <p:ajax event="change" update=":formId:address"/>
        <f:selectItem itemLabel="E-mail" itemValue="Email"/>
        <f:selectItem itemLabel="Fax" itemValue="Fax"/>
    </p:selectOneMenu>
    <p:inputText id="address" value="#{testEntity.address}">
        <f:validator validatorId="emailValidator" disabled="#{testEntity.type != 'Email'}"/>
    </p:inputText>
    <!-- button to call bean method with testEntity as param -->
</h:form>

它不起作用,验证器永远不会激活,但 ajax 调用正在工作,因为我可以看到其他字段中的更改值。

最佳答案

不幸的是这是不可能的。 <f:xxx>标签是标签处理程序(不是 UI 组件),它们在 View 构建期间运行,而不是在 View 渲染期间运行。因此,如果在构建 View 期间禁用它,则它将始终被禁用,直到重新创建 View (例如通过新请求或非空导航)。

您需要有一个“全局”验证器,它根据type进一步委托(delegate)给所需的验证器。属性。

例如

<p:inputText ... validator="#{testEntity.validateAddress}" />

public void validateAddress(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if (type == Email) {
        context.getApplication().createValidator("emailValidator").validate(context, component, value);
    }
}

更新 OmniFaces最近添加了一个新的 <o:validator> 标签应该完全解决这个问题,如下所示:

<o:validator validatorId="emailValidator" disabled="#{testEntity.type != 'Email'}"/>

查看展示示例 here .

关于ajax - 通过ajax禁用验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10677984/

相关文章:

jsf - 在 oncomplete 时更改 commandButton 的值和背景颜色

validation - JSF 2.1.X 验证在 Glassfish 3.1.2 与 Tomcat 6 & 7 上的行为不同

JSF <t :inputFileUpload> value lost after validation failure

validation - Angular 2,数据验证和输入掩码困难

javascript - jQuery 表单在更正验证失败后不提交

php - Ajax 成功 jquery php

javascript - 单击监听器以 ajax 加载内容。纯javascript

jquery - DataTables (serverSide) 在第一次请求时正常,在搜索或重新排序时请求中失败并显示 "[Object object"]

javascript - 如何控制加载查询功能的元素

jsp - 堆空间中的缓冲响应导致大文件出现问题