1

令我惊讶的是,在我在文本框中输入的每个键之后都没有发生ajax 调用。只有在输入 14 位数字后才会调用 ajax 。不确定在这种情况下 ajax 与 validateRegex 标记处理程序有何关联?另外,我可以说<f:validateRegex>, <f:valiadteLength>etc 将始终在客户端执行验证(如 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>
4

1 回答 1

2

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

有一些混乱正在发生。上述陈述不属实。

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

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

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


根据评论进行更新disabled,只需在视图端检查输入组件在其他组件属性中的有效性,方法是检查UIInput#isValid()通过将组件绑定到视图可以获得的结果:

<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 侦听器方法。

于 2012-10-23T18:28:23.117 回答