我试图在很长的表格上实现自动保存功能。
我在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-blueform-save-blueform-btn-ui的click事件并验证一些内容。一切都好之后,点击#form-blueform-save-blueform-btn。一切都很好,直到这一点。
当我动态想要用$(#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-blueform-save-blueform-btn-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)
并且对于每个不能为空的输入重复。
答案 0 :(得分:2)
好的,所以我终于明白了。我必须使用jQuery的.change()手动触发每个输入的onchange事件,以便执行ajax并且JSF识别值的动态变化。
$(".form-control").each(function() {
$(this).change();
});
我确信至少可以节省几个小时。