2010-10-28 173 views
1

我有一個相當大的數據採集表單。主要的問題是我總是需要點擊提交按鈕兩次才能提交表單。我第一次按它,它只是刷新,什麼都不做。這是爲什麼?在我的表格裏面,有很多輸入文字。爲什麼我必須點擊我的提交按鈕兩次?

還有一些動態選擇菜單,其中的項目列表根據不同菜單中的選定項目而變化。我的懷疑是因爲有valueChangeListener,onchange =「submit()」和immediate =「true」,所以問題在於此,可能會有一些我不太明白的副作用。雖然我沒有收到任何錯誤消息。任何人都面臨過這樣的問題?

<h:commandButton type="submit" value="Add Job Profile" action="{formBean.commitData}"/> 

    public void commitData() { 
    QueryRunner run = new QueryRunner(ds); 
    String insertSql = "sql command here"; 

    try { 
     int numberOfCommits = run.update(insertSql); 
     if (numberOfCommits > 0) { 
      JOptionPane jop = new JOptionPane("Inserted " + numberOfCommits +"record"); 
      JDialog dialog = jop.createDialog("Upload complete"); 
      dialog.setAlwaysOnTop(true); 
      dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
      dialog.setVisible(true); 
     } else { 
      JOptionPane jop = new JOptionPane("Upload failed. Please try again."); 
      JDialog dialog = jop.createDialog("Upload failed"); 
      dialog.setAlwaysOnTop(true); 
      dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
      dialog.setVisible(true); 

     } 

    } catch (SQLException sqle) { 
     sqle.printStackTrace(); 
    } 
} 

我第一次點擊時甚至沒有收到上傳失敗的消息。第二次點擊時,上傳成功。

編輯:是的,這是動態的選擇菜單。如果我刪除這些菜單,我可以在第一次點擊時提交。不過,我該如何解決這個問題?

<h:outputLabel value="Family: " /> 
<h:selectOneMenu id="selectFamily" 
       value = "#{formBean.selectedFamily}" 
       valueChangeListener="#{menuBean.changeFamily}" 
       onchange="submit()" 
       immediate = "true" > 
<f:selectItems id="familyNames" value="#{menuBean.familyNames}" /> 
</h:selectOneMenu> 


<h:outputLabel value="Function: " /> 
<h:selectOneMenu id="selectFunction" 
       value="#{formBean.selectedFunction}" 
       immediate="true" > 

<f:selectItems id="functionNames" 
       value="#{menuBean.functions}" /> 
</h:selectOneMenu> 

    // listen for family change and render relevant function 
     public void changeFamily(ValueChangeEvent event) { 
      FacesContext context = FacesContext.getCurrentInstance(); 
      String value = (String) event.getNewValue(); 
      switchFunctions(value); 
      context.renderResponse(); 
     } 
+0

你試過在按鈕上設置immediate =「true」嗎? – Steven 2010-10-28 04:48:08

+0

已經這樣做了,這使事情變得更糟。在我的輸入字段中,所有內容都傳遞爲null。 – 2010-10-28 06:07:33

回答

1

我有一個類似的問題顯示彈出窗口。顯示彈出窗口後,單擊提交按鈕只刷新彈出窗口。沒有數據與託管bean同步。但是,當再次點擊按鈕時,它會提交數據。

我解決了這個改變,顯示彈出,從代碼...

<a4j:commandButton value="Reserve" disabled="#{login.mayReserve == false}" immediate="true" 
     title="To set an available number to the Reserved state." 
     oncomplete="#{rich:component('selectCustomer')}.show();" render="selectCustomer" > 
    <f:setPropertyActionListener target="#{managementController.menuAction}" value="Reserve" /> 
</a4j:commandButton> 

要...

<a4j:commandButton value="Reserve" disabled="#{login.mayReserve == false}" immediate="true" 
     title="To set an available number to the Reserved state." render="selectCustomer" > 
    <f:setPropertyActionListener target="#{managementController.menuAction}" value="Reserve" /> 
    <a4j:ajax event="click" oncomplete="#{rich:component('selectCustomer')}.show()" reRender="@all" /> 
</a4j:commandButton> 

我不知道是什麼的這種技術性的但也許它可以幫助別人前進......

0

顯然valueChangeListener在提交時也觸發了。行context.renderResponse()將導致調用應用程序階段被完全跳過。當初始菜單值與提交值不相同時,將觸發valueChangeListener。驗證這一點。

無論如何,有同步下拉菜單,結合其他輸入字段在同一形式驗證是真正的皮塔餅。因此,長話短說,這裏只是一個鏈接:populate child menus (in JSF)

+0

嗨BalusC,你的方法可能工作,但我認爲它的方式太多的代碼來執行這樣一個簡單的任務。我在http://www.coreservlets.com/JSF-Tutorial/jsf2/#Ajax找到了一個更簡單的ajax解決方案。嘗試了它,它的工作原理。 Primefaces還提供了另一個簡單的ajax解決方案http://www.primefaces.org/showcase/ui/pprSelect.jsf,雖然我還沒有嘗試過。 – 2010-11-01 09:20:12

相關問題