2017-02-21 54 views
0

Я пытаюсь реализовать функцию автосохранения в очень длинной форме.Изменение динамических значений ввода с помощью jQuery не влияет на событие ajax onchange компонента JSF

У меня есть эта форма в JSF с большим количеством <h:inputText/> s, который не может быть пустым или пустым из-за аннотации валидации @NotNull javax. Кроме того, у меня есть некоторые <h:selectOneMenu> S, которые имеют

<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 принимает событие щелчка # форм-blueform-копи-blueform-БТН-щ и проверяет некоторые вещи. После всего, что все в порядке, он нажимает # form-blueform-save-blueform-btn. Все работает отлично до тех пор.

Проблема возникает, когда я динамически хочу изменить значение входов JSF с помощью $ (# someinput) .val ("new value"). Значение ОТНОСИТСЯ отлично, но событие ajax onchange выпадающего меню - например, не выполняется. Кроме того, если я попытаюсь отправить форму, проверки jQuery появятся в порядке, но тогда проверки JSF не будут утверждать, что все равно null. По сути, компоненты JSF не распознают изменения значения jQuery.

Я боролся с этим в течение некоторого времени и не могу найти ничего полезного. Я был бы очень признателен, если бы кто-нибудь мог направить меня сюда.

Здесь вы можете найти еще фрагменты моего кода:

Это как мои <h:inputText> s выглядеть

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

Это как моя JQuery обрабатывает # форм-blueform-копи-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:

ПРЕДУПРЕЖДЕНИЕ: $ {ImproveView.save()}: java.lang.IllegalArgumentException: не может проанализировать номер аргумента: interpolatedMessage = 'не может быть null' javax.faces.FacesException: $ {ImproveView.save()} : java.lang.IllegalArgumentException: невозможно разобрать аргумент number: interpolatedMessage = 'не может быть null' at com.sun.faces.application.ActionListenerImpl.processAction (ActionListenerImpl.java:118) at javax.faces.component. UICommand.broadcast (UICommand.java:315) at javax.faces.component.UIViewRoot.broadcastEvents (UIViewRoot.java:790) at javax.faces.component.UIViewRoot.processApplication (UIViewRoot.java:1282) at com. sun.faces.lifecycle.InvokeApplicationPhase.execute (InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase (Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute (LifecycleImpl.java:198) at 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) в орг .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) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:239) at 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) в орг. apache.catalina.authenticator.AuthenticatorBase.invoke (Authent icatorBase.java:502) на org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:142) на org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:79) at org. apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:616) на org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process (AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol.java:673) at 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) на java.util.concurrent. ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) at java.lang.Thread.run (Thread.java: 745)

, и это повторяется для каждого ввода, который не может быть пустым.

ответ

0

Хорошо, поэтому я, наконец, понял это. Я должен запускать событие onchange вручную каждого входа с помощью jQuery .change(), поэтому ajax выполняется, а JSF распознает динамическое изменение значений.

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

Я уверен, что это сэкономит, по крайней мере, несколько часов.