【问题标题】:f:ajax call is not working with f:validateRegexf:ajax 调用不适用于 f:validateRegex
【发布时间】:2012-10-13 17:45:49
【问题描述】:

令我惊讶的是,在我在文本框中输入的每个键之后不会发生 ajax 调用。 只有在输入 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>

【问题讨论】:

    标签: ajax validation jsf-2


    【解决方案1】:

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

    发生了一些混乱。以上说法不属实。

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

    您可能实际上是指未调用&lt;f:ajax listener&gt; 中指定的动作侦听器方法。反过来,这确实是真的。但这是完全预期的行为。即存在验证错误。这样,JSF 将跳过 UPDATE_MODEL_VALUES 和INVOKE_ACTION 阶段。所以动作方法实际上是设计上没有被调用的。验证错误时不应该执行业务逻辑。

    我不确定您为什么希望调用它。为什么要对无效输入执行业务逻辑?如果您更详细地阐述具体功能,那么我们也许可以为此提出正确的方法。


    更新根据 cmets,只需检查 UIInput#isValid() 的结果即可在视图侧完全检查其他组件的 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 监听器方法。

    【讨论】:

    • hi balu... 由于我不回答我自己的问题,我在这里将我的要求粘贴在 3 个不同的 cmets 中。
    • 你是对的。我的意思是监听器方法没有被调用。 1)我的页面中有 2 个差异面板网格 2)第一个面板网格只有一个文本框;第二个有 3 个文本框和一个日期选择器 3) req 1 - 当用户开始在面板网格 1 文本框中输入数字时,禁用所有面板网格 2 特定组件。 4) 要求 2 - 反之亦然。
    • 所以,我维护了 2 个 bean 属性,比如 attr1 和 attr2(一个用于面板网格 1 组件,另一个用于面板网格 2 组件),我使用它们禁用了组件。现在,当用户在面板网格 1 文本框中输入一个字符时,ajax 侦听器方法会将“attr2”设置为“true”,以便面板网格 2 组件将被刷新和禁用。以同样的方式,当用户开始在任何面板 grid2 特定组件中输入字符时,我将“attr1”设置为“true”。
    • 所以在我的情况下,客户端验证(f:regEx 或 f:valdateLength 等)不需要在用户输入每个数字后立即执行。但请记住验证必须发生,并且出于我自己的兴趣,我希望使用 f:regEx 客户端验证,而不是在服务器端处理它。请提出建议。
    • 查看答案更新。请注意,这些绝对不是“客户端验证”。
    猜你喜欢
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2011-05-15
    • 2020-06-30
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多