2011-10-10 60 views
4

我有一個兩個標籤頁,一個標籤是記錄列表,點擊記錄會切換到編輯標籤,並且在編輯中有Save和Cancel按鈕標籤。JSF immediate =「true」取消按鈕不起作用

現在,我點擊記錄#1,做一些編輯,然後點擊取消按鈕。當然,我不想驗證表單,因爲它已被取消,所以我在取消按鈕上設置了immediate="true"。現在編輯選項卡關閉,回到記錄列表。然後,我點擊另一條記錄#2,發生問題:在編輯選項卡中,它仍然是記錄#1的先前內容,而不是記錄#2。我已經在調試視圖中檢查了變量,編輯表單的back bean被ACTUALLY填滿了記錄#2。

即,立即命令後被破壞的東西。

(一切都已經好之前,我已經加入了驗證,並立即= 「真」。)

class FormBean { 

    Record activeRecord; 
    ... 

    public void clickOnList() { 
     activeRecord = loadRecord(clickIndex); 
    } 

    public void cancelForm() { 
     activeRecord = null; 
    } 

} 

page.xhtml:

<h:form id="main"> 
    ... 
    <p:tab title="Edit" rendered="#{formBean.activeRecord != null}"> 
    ... 
    <p:commandButton value="Cancel" 
     actionListener="#{formBean.cancelForm}" 
     update="main" async="true" immediate="true" /> 
    </p:tab> 
</h:form> 

回答

17

immediate="true"不能很好地使用Ajax工作請求相同的觀點。歸結起來,輸入組件中仍存在已提交但未驗證的值。如果沒有ajax,後續表單提交的正常同步請求/響應將默默「解決」這個問題。但與Ajax,這不會發生。前面的ajax請求的提交值仍然存在於輸入組件中。當UIInput#getSubmittedValue()不返回null時,它將被顯示,而不考慮(更改)的模型值。

基本上,當你要堅持到阿賈克斯取消按鈕,你需要排除被處理,而不是依靠immediate="true"(這實際上是一種黑客攻擊)的輸入。在標準的JSF <f:ajax>條款中,您可以使用execute="@this"(這實際上是默認設置),而不是execute="@form"。 PrimeFaces按鈕默認爲@form,因此您需要更改此設置:

<p:commandButton value="Cancel" 
    actionListener="#{formBean.cancelForm}" 
    update="main" async="true" process="@this" />