2015-06-23 58 views
1

我已經通過JSF做了一個頁面,用戶可以在窗體中輸入一些值。如果用戶對輸入沒有問題,他可以單擊一個提交按鈕,用新值更新模型。通過AJAX驗證JSF而不更新模型

我想要實現的是:我希望每次都觸發輸入驗證,用戶在輸入字段中輸入一個符號。但在這個時候,型號應該更新NOT。如果用戶單擊提交按鈕,則只應更新模型。我希望這種行爲有更好的使用體驗。用戶應該有能力,例如在瀏覽器中按下後退按鈕並且他的更改未附加到模型上。另外,我希望用戶在輸入時看到他是否輸入了廢話。

目前我JSF的文件看起來是這樣的:

<h:inputText 
     required="true" 
     requiredMessage="Please enter a value." 
     id="input_value" value="#{myBean.myValue}" 
     styleClass="input" 
     validatorMessage="Please enter a value." > 
     <f:ajax 
      event="keyup" 
      execute="input_value" 
      render="input_value"/> 
    </h:inputText> 

這觸發驗證每次用戶輸入一個標誌到輸入字段。但它也更新了模型。而那不是我想要的。

+0

爲什麼不使用提交時的「臨時/工作」模型複製到真實模型?我在很多場合使用這種模式,它對我們很好用 – Kukeltje

+0

是的,那也是我的方法。但我首先想檢查是否有更智能的解決方案。 – Sneek

回答

1

這是不可能的。至少不是沒有黑客入侵JSF impl。

幸好你提到的X你XY-problem的所以這可以合理地回答:

我希望這個行爲更好userexperience。用戶應該有能力,例如按後退按鈕在瀏覽器和他的更改不會附着在模型

爲了解決這個問題,只是指示瀏覽器緩存從不動態頁面。詳細信息可在此Q & A:Avoid back button on JSF web application中找到。您還需要確保您爲其擁有的數據選擇正確的bean作用域。即不要將視圖範圍數據放在會話範圍的bean中。這些表單bean必須處於最多視圖範圍內。另請參閱How to choose the right bean scope?

+0

啊,目前我持有模型的bean是SessionScoped。我認爲如果我改用ViewScoped,它也會像我想要的那樣工作。如果我更改爲ViewScoped,則可以在用戶每次向文本字段中輸入符號時驗證輸入。這也可能會更新模型,但這並不重要,因爲下次顯示視圖時,bean將被重新創建(因爲它的ViewScoped ?!)。我對嗎? – Sneek

+0

是的,但要確保它沒有任何提交,因爲它最終會在db – Kukeltje

+0

不確定你在暗示「?!」,但只是嘗試和觀察自己。在上面的帖子的最後一個鏈接中也有詳細解釋。如果您想了解如何選擇合適的bean範圍,我建議您點擊該鏈接。 – BalusC