2015-10-30 35 views
0

如果表單中有空的required字段,它們會阻止我通過代碼設置值並根據當前用戶輸入隱藏/顯示其他字段。 我打破了我的問題給一個小例子:必填字段跳過對用戶輸入的反應

  <h:inputText label="Name" value="#{req.test}" required="true"/> 
      <h:inputText label="Details" value="#{req.tests2}" readonly="true" required="true"/> 

      <h:selectBooleanCheckbox label="Hide field" value="#{req.bool1}"/> 
      <ui:fragment rendered="#{not req.bool1}"> 
       <h:inputText label="Hidden" value="#{req.test3}" required="true"/> 
      </ui:fragment> 

required場在我的形式,但如果用戶選擇第一組的複選框,我想隱藏字段出現,即使驗證失敗。我希望這些字段被標記爲無效,所以我不能立即使用。


的問題是,在處理的驗證,的renderResponse被稱爲在JSF生命週期。所以更新模型的值階段會被跳過,我無法對用戶輸入做出反應。

除此之外:如果我填與複選框選中所有required領域(的形式將是有效的),並取消選中該複選框(一required"Hidden"出現),我不能只是讓"Hidden"通過檢查再次消失複選框,因爲"Hidden"不能爲空作爲required字段。 即使我說required="#{not req.bool1}"這是行不通的,因爲該複選框值,因爲更新模型值階段被跳過從來沒有達到我的模型。

我們現在所做的是包裹面部上下文,以防止在設置標誌的驗證階段調用renderResponse()。 (是的,很危險,是的,我確實需要更好的方法來做到這一點。)現在終於模型是最新的,但是: 必填字段仍然是空的,因爲由於某些原因,jsf決定required字段不需要只要它們是空的/無效的,就可以從我的模型中獲得它們的價值。

  1. 我怎樣才能讓我的模型出現在required領域
  2. 是否有簡單且適當的方式解決我的忽略無效狀態後繼續運行與 - 相 - 正確的問題,以外基本上防止renderResponse()發生?
+0

將ajax支持添加到您的h:selectBooleanCheckbox UI元素:event =「click」render =「id」,並帶有渲染@form或fragment的父項 –

+0

所以你的意思是我需要每次更改一些內容時更新表單在我的模型中更改必填字段值的字段?不幸的是,這是行不通的,因爲正如我所說由於某種原因,jsf認爲空的必填字段不需要從模型更新它們的值。其他領域顯示其價值,只是所需的領域保持空白。 – Neepsnikeep

+0

但是,感謝與AJAX提示...我現在在代碼中這樣做。重置組件後,它會正確更新: 'UIInput ui = ...通過id獲取reqired字段; ui.resetValue(); Ajax.update(ui.getClientId());' 現在值顯示。這些字段仍然具有無效狀態,因爲在驗證階段,它們仍然是空的,但是很好。我現在可以忍受,我猜... 但是,這種解決方法真的是唯一的方法來標記字段無效,並仍然對其他用戶輸入作出反應?我的解決方案似乎太複雜了,不能做這樣一件基本的事情。 – Neepsnikeep

回答

0

所以第一個問題的答案是:重置值然後更新,然後我得到我的值顯示在必填字段。感謝Vasil!

至於第二個問題:我不知道它怎麼可能沒有人碰到了問題之前。只有我嗎?那麼,我想我沒有明白這一點,並且正在使用錯誤的生命週期或其他東西。但我真的認爲視圖應該對用戶輸入做出響應,即使它有些字段仍然是空的。用戶仍然在插入數據,但我們還沒有繼續。該字段在該狀態下允許爲空。 我想這就是要點,我的「必需」意味着除了jsf「required」之外的其他意思。我仍然沒有得到這方面的標準驗證過程...

但我對我的問題有一個骯髒的解決方法,所以我會將問題標記爲已回答。