使用jQuery动态更改输入值不会对JSF组件的{ajax onchange事件

时间:2017-02-21 19:23:12

标签: java jquery ajax jsf

我试图在很长的表格上实现自动保存功能。

我在JSF中有这个表单,其中有很多<h:inputText/>由于@NotNull javax验证注释而无法为空或空。另外,我有一些<h:selectOneMenu>

<f:ajax event="change" render="form-blueform-pnl_team" execute="form-blueform-pnl_team" listener="${improvementView.onTeamChange()}" />

动态更新其他<h:inputText/>个值。

提交就像:

<h:commandButton action="${improvementView.save()}" styleClass="btn btn-primary ink-reaction marginleft5 hidden" id="save-blueform-btn">
    <f:ajax execute="@all" render="@all"/>
</h:commandButton>
<a href="#" id="form-blueform-save-blueform-btn-ui" class="btn btn-primary ink-reaction marginleft5">
    <i class="fa fa-save"></i> Save
</a>

jQuery接收#form-b​​lueform-save-blueform-b​​tn-ui的click事件并验证一些内容。一切都好之后,点击#form-b​​lueform-save-blueform-b​​tn。一切都很好,直到这一点。

当我动态想要用$(#someinput).val(&#34; new value&#34;)更改JSF输入的值时,麻烦就开始了。值DOES完全改变但是下拉列表的ajax onchange事件 - 例如 - 没有被执行。此外,如果我尝试提交表单,jQuery验证会出现问题,但是JSF验证失败后说一切都为空。实质上,JSF组件无法识别jQuery值的更改。

我一直在努力解决这个问题,现在找不到任何有用的东西。如果有人能在这里指导我,我真的很感激。

在这里,您可以找到我的代码的更多代码段:

这就是<h:inputText>的样子

<h:inputText id="name" value="${improvementView.item.name}" styleClass="form-control" pt:required="required" />

这就是我的jQuery处理#form-b​​lueform-save-blueform-b​​tn-ui点击的方式:

$("#form-blueform-save-blueform-btn-ui").click(function(e) {
    var valid = $(".form-blueform")[0].checkValidity();
    if(valid) {
        $(".card-actionbar-row .btn").hide();
        $("#form-blueform-loading-submit").css({"display":"inline-block"});
        $("#form-blueform-save-blueform-btn").click();
        } else {
            $(".form-blueform")[0].reportValidity();
    }
    e.preventDefault();
});

这是Tomcat返回的日志:

  

警告:$ {improvementView.save()}:java.lang.IllegalArgumentException:无法解析参数号:interpolatedMessage =&#39;可能不为空&#39;   javax.faces.FacesException:$ {improvementView.save()}:java.lang.IllegalArgumentException:无法解析参数号:interpolatedMessage =&#39;可能不为空&#39;       at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)       在javax.faces.component.UICommand.broadcast(UICommand.java:315)       在javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)       在javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)       at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)       在com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)       在com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)       在javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)       在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)       在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)       在org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)       在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)       在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)       在com.madatait.ci.security.filters.AuthenticationFilter.doFilter(AuthenticationFilter.java:46)       在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)       在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)       在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)       在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)       在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)       在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)       在org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)       在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)       在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)       在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)       at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:673)       在org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1500)       在org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1456)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)       at org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)       在java.lang.Thread.run(Thread.java:745)

并且对于每个不能为空的输入重复。

1 个答案:

答案 0 :(得分:2)

好的,所以我终于明白了。我必须使用jQuery的.change()手动触发每个输入的onchange事件,以便执行ajax并且JSF识别值的动态变化。

$(".form-control").each(function() { 
    $(this).change();
});

我确信至少可以节省几个小时。