2012-10-04 98 views
1

在我的JSF頁面上,我在dataTable中顯示一個簡單的數據庫表。我希望能夠編輯此表中的行。作爲解決方案,當您單擊第一列中的值時,我會彈出一個對話框。我使用setPropertyActionListener在我的支持bean中設置當前行/實體。這似乎工作。但是,彈出式窗口會在幾分之一秒後消失。我不明白這是爲什麼。有沒有人有建議?JSF對話框立即消失

這裏是我的DataTable的JSF碼:(你可以看到我使用PrimeFaces)

<h:form id="dataForm"> 
    <p:dataTable value="#{misterBean.values}" var="value"> 
     <p:column> 
      <h:commandLink value="#{value.name}" onclick="updateDlg.show()"> 
       <f:setPropertyActionListener 
        target="#{misterBean.value}" 
        value="#{value}" /> 
      </h:commandLink> 
     </p:column> 
     <!-- more columns --> 
    </p:dataTable> 
</h:form> 

,並在該對話框的JSF代碼:

<p:dialog id="updateDialog" header="Update data" widgetVar="updateDlg"> 
    <h:form id="updateForm"> 
     <h:panelGrid columns="2" cellpadding="5"> 
      <h:outputLabel for="name" value="Name:" /> 
      <p:inputText id="name" value="#{misterBean.value.name}" /> 
      <h:outputLabel for="flag" value="Flag:" /> 
      <p:selectBooleanButton id="flag" 
       value="#{misterBean.value.flag}" 
       onLabel="On" 
       offLabel="Off" /> 
      <f:facet name="footer"> 
       <p:commandButton id="submitButton" 
        value="Submit" 
        actionListener="#{misterBean.update}" 
        oncomplete="updateDlg.hide()" 
        update=":dataForm" /> 
      </f:facet> 
     </h:panelGrid> 
    </h:form> 
</p:dialog> 

的後盾bean看起來像這樣:

@Controller 
@ManagedBean(name = "misterBean") 
@ViewScoped 
public final class MisterBean { 

    private final MyService myService; 
    private final List<Value> values; 
    private Value value; 

    @Autowired 
    public MisterBean(final MyService myService) { 
     this.myService = myService; 
     this.values = this.myService.loadValues(); 
     this.value = new Value(); 
    } 

    public List<Value> getValues() { 
     return this.values; 
    } 

    public Value getValue() { 
     return this.value; 
    } 

    public void setValue(final Value value) { 
     this.value = value ; 
    } 

    public void update(final ActionEvent e) { 
     this.myService.save(this.value); 
     this.value = new Value(); 
    } 

} 
+0

又有怎樣的 'updateDlg.show()' 你的javascript代碼?告訴我,如果我錯了,但onClick只能調用客戶端JavaScript方法。 'updateDlg.hide()'也是一樣。 – reporter

+0

我在不同的頁面上做了同樣的工作,它在那裏工作。無論如何:我實際上看到對話非常簡短,所以我猜'show()'起作用了。我承認我不知道這是如何工作的。 – Rinke

+0

您正在同步提交表單,而不是由ajax異步提交。 – BalusC

回答

3

難道是在顯示對話框後頁面刷新?我建議嘗試使用primefaces commandLink而不是原生jsf commandLink,因爲我相信默認設置的primefaces commandLink有ajax=true

變化<h:commandLink...<p:commandLink...

+0

我也會用'oncomplete'替換'onclick',這樣只有在實際調用動作後纔會顯示對話框。我還會添加'update =「:updateDialog」',以便在顯示對話框的內容之前使用新的模型值進行更新。 – BalusC