簡體   English   中英

使用jQuery動態更改輸入值不會影響JSF組件的ajax onchange事件

[英]Changing input values dynamically with jQuery doesn't action the ajax onchange event of the JSF component

我正在嘗試以很長的形式實現自動保存功能。

我在JSF中有很多<h:inputText/>的表單,由於@NotNull javax驗證批注,它們不能為null或為空。 另外,我有一些<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(“ new value”)更改JSF輸入的值時,麻煩就開始發生。 值確實可以完美更改,但是下拉列表的ajax onchange事件(例如)不會執行。 另外,如果我嘗試提交表單,則jQuery驗證正常,但JSF驗證失敗,說明所有內容均為null。 本質上,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 ='不能為空'javax.faces.FacesException:$ {improvementView.save()}:java.lang .IllegalArgumentException:無法解析參數編號:在javax.faces.component.UICommand.broadcast(UICommand.com)的com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)處,interpolatedMessage ='可能不為null'。 java:315)位於javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)位於javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)位於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。 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)處的webapp.FacesServlet.service(FacesServlet.java:646) 位於org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)的che.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)(com.madatait.ci.security.filters.AuthenticationFilter.doFilter(AuthenticationFilter.java:46)處的ApplicationFilterChain.java:239) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)處的.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)在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。 org.apache上的StandardHostValve.invoke(StandardHostValve.java:142)。 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)上的catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 88)在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)在org.apache.catalina.connector.CoyoteAdapter.java(518)在org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1500)的.process(AbstractProtocol.java:673)org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint .java:1456),位於org.apache.tomcat.util。java.util.concurrent.ThreadPoolExecutor$ Worker.run(ThreadPoolExecutor.java:617),位於java.util.concurrent.ThreadPoolExecutor.java:1142。 java.lang.Thread.run(Thread.java:745)上的threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)

並且對於每個不能為null的輸入重復此操作。

好的,所以我終於弄清楚了。 我必須使用jQuery的.change()手動觸發每個輸入的onchange事件,以便執行ajax並且JSF識別值的動態變化。

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

我確信這將至少為某人節省幾個小時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM