f:ajax调用不能与f:validateRegex一起使用

时间:2012-10-23 18:02:38

标签: ajax validation jsf-2

令我惊讶的是,在我在文本框中输入的每个键之后,ajax调用是 NOT 。只有在输入 14位数字后才会调用ajax 。在这种情况下,不确定ajax如何与validateRegex标记处理程序相关?另外,我可以说<f:validateRegex>, <f:valiadteLength>等会在客户端执行验证(比如java script / jquery)吗?

<h:inputText id="input" value="#{bean.input}" maxlength="16">
<f:ajax event="keyup" render="another_id" listener="{bean.method}"/>
<f:validateRegex pattern="[0-9]{14}" />
</h:inputText>

1 个答案:

答案 0 :(得分:1)

  

在我在文本框中输入的每个键后都没有发生ajax调用。只有在输入14位数后才会调用ajax

有一些混乱。以上陈述不属实。

绝对会调用ajax调用。跟踪webbrowser内置开发人员工具集中的HTTP流量(按Chrome / IE9 / Firebug中的F12并检查网络部分)。在/*或JSF PhaseListener上创建一个HTTP过滤器,你会看到它在每次按键时被调用(这意味着服务器每次都被命中)。

您实际上可能意味着未调用<f:ajax listener>中指定的动作侦听器方法。这反过来确实如此。但那是完全预期的行为。这是一个验证错误。这样JSF将跳过 UPDATE_MODEL_VALUES和INVOKE_ACTION阶段。因此,操作方法确实没有被调用。当出现验证错误时,应该不执行业务逻辑。

我不确定你为什么期望它被调用。为什么要在无效输入上执行业务逻辑?如果您更详细地详细说明具体功能,那么我们可以为此提出正确的方法。


根据评论

更新,只需通过查看{{3}的结果,在视图中完全检查其他组件的disabled属性中输入组件的有效性您可以通过将组件绑定到视图来获取:

<h:inputText ... binding="#{input}">
    <f:ajax event="keyup" render="input2 input3 input4" />
    <f:validateRegex pattern="[0-9]{14}" />
</h:inputText>

<h:inputText id="input2" ... disabled="#{not input.valid}" />
<h:inputText id="input3" ... disabled="#{not input.valid}" />
<h:inputText id="input4" ... disabled="#{not input.valid}" />

不需要ajax侦听器方法。