2011-01-11 124 views
4

好的,在這裏你是核心問題。JSF:如何在ajax請求中刷新必填字段

頁面。我有兩個必需的「輸入文本」。 一個命令按鈕,用於更改bean值並重新調用「作業」對象。

<a4j:form id="pervForm"> 
    SURNAME:<h:inputText id="surname" label="Surname" value="#{prevManager.surname}" required="true" /> 
    <br/>    
    JOB:<h:inputText value="#{prevManager.job}" id="job" maxlength="10" size="10" label="#{msg.common_label_job}" required="true" /> 
    <br/> 

    <a4j:commandButton value="Set job to Programmer" ajaxSingle="true" reRender="job"> 
     <a4j:actionparam name="jVal" value="Programmer" assignTo="#{prevManager.job}"/> 
    </a4j:commandButton> 

    <h:commandButton id="save" value="save" action="save" class="HATSBUTTON"/> 

</a4j:form> 

這裏簡單經理:

public class PrevManager 
{ 

    private String surname; 
    private String job; 

    public String getSurname() 
    { 
     return surname; 
    } 

    public void setSurname(String surname) 
    { 
     this.surname = surname; 
    } 

    public String getJob() 
    { 
     return job; 
    } 

    public void setJob(String job) 
    { 
     this.job = job; 
    } 

    public String save() 
    { 
     //do something 
    } 

} 

讓我們做到這一點:

上的作業輸入文本寫的東西(如 「老師」)。 留空姓。 保存。 出現驗證錯誤(姓是強制性的)。 按「將作業設置爲程序員」:沒有任何反應。

檢查bean值,我發現它正確更新,確實頁面上的組件沒有更新!

那麼,根據JBoss的文檔,我發現:

阿賈克斯區域是一個關鍵的Ajax組件。 它會限制部件 樹的部分在服務器 一側發生ajax請求時處理。 處理意味着 解碼,驗證和型號更新 階段期間的調用。使用 區域最常見的原因是:

其它形式的輸入 不必要對於給定的AJAX請求的 驗證期間-avoiding JSF生命週期處理的終止執行; - 定義事件發送的不同策略 (immediate =「true/false」) - 顯示ajax狀態的單獨指示器 - 提高呈現處理的性能 (selfRendered =「true/false」, renderRegionOnly =「真/假」)

下面的兩個例子示出了 情況時驗證錯誤並 不允許處理一個Ajax輸入。 輸入名稱。輸出文字 組件應該在您之後重新出現。 但是,在第一種情況下,此 活動將由於 其他字段的required =「true」而中止。 當「作業」字段爲空時,您將只看到錯誤消息 。

給您的例子:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:a4j="http://richfaces.org/a4j" 
     xmlns:rich="http://richfaces.org/rich"> 

     <style> 
      .outergridvalidationcolumn { 
       padding: 0px 30px 10px 0px; 
      } 
     </style> 

    <a4j:outputPanel ajaxRendered="true"> 
     <h:messages style="color:red" /> 
    </a4j:outputPanel> 
    <h:panelGrid columns="2" columnClasses="outergridvalidationcolumn"> 

     <h:form id="form1"> 
       <h:panelGrid columns="2"> 
        <h:outputText value="Name" /> 
        <h:inputText value="#{userBean.name}"> 
         <a4j:support event="onkeyup" reRender="outname" /> 
        </h:inputText> 
        <h:outputText value="Job" /> 
        <h:inputText required="true" id="job2" value="#{userBean.job}" /> 
       </h:panelGrid> 
     </h:form> 

     <h:form id="form2"> 
      <h:panelGrid columns="2"> 
       <h:outputText value="Name" /> 
       <a4j:region> 
        <h:inputText value="#{userBean.name}"> 
         <a4j:support event="onkeyup" reRender="outname" /> 
        </h:inputText> 
       </a4j:region> 
       <h:outputText value="Job" /> 
       <h:inputText required="true" id="job1" value="#{userBean.job}" /> 
      </h:panelGrid> 
     </h:form> 

    </h:panelGrid> 
    <h:outputText id="outname" style="font-weight:bold" value="Typed Name: #{userBean.name}" /> 
    <br /> 
</ui:composition> 

Form1中:該行爲是不正確。我需要填寫這份工作,然後填寫姓名。 Form2:行爲是正確的。我不需要填寫這份工作來查看正確的價值。

不幸的是,使用Ajax區域並沒有幫助(事實上我用它糟糕的方式...),因爲我的字段都是必需的。這是主要的不同。

有什麼想法?

非常感謝。

回答

0

使用a4j:actionparam將設置該值,但在這種情況下無法繞過驗證。驗證發生在組件上(而不是bean屬性)。所以,當你提交時,組件的值仍然是空的。希望這可以幫助。

+0

我不是在無效組件上工作。我只需要改變一個有效的組件的值...我改變了bean的值,我不能強制更新(immediate,reRender,ajaxRegion等等)。我發現的唯一方法是使用process屬性。在這種情況下,組件被正確更新,但是如果並且僅當它具有初始值(我的意思是:組件具有非空值)。因此,無法強制... – Tama 2011-01-12 09:18:44

+0

將ajaxSingle =「true」放在按鈕上,然後重新渲染輸入組件。 – 2011-01-13 00:24:55

0

當你點擊「Set job to Programmer」時,沒有反應,因爲你沒有重新編輯你的消息組件。如果你這樣做,你將能夠看到驗證信息。

您需要重新描繪的消息,因爲它是一個<a4j:commandButton/>,不是一個簡單的<h:commandButton/>

嘗試使用道具。 「將作業設置爲程序員」按鈕中的immediate並檢查它是否會更新該字段。

<a4j:commandButton value="Set job to Programmer" ajaxSingle="true" reRender="job" immediate="true"> 
    <a4j:actionparam name="jVal" value="Programmer" assignTo="#{prevManager.job}"/> 
</a4j:commandButton> 

*我使用immediate不認爲 「ajaxSingle」 有必要在這裏..

也許你可以得到一個新的問題......,這個bean值將不會更新(也許!)。如果發生了,請創建一個手動設置bean值的bean方法。否則,如果bean值已更新且字段仍然爲空,請嘗試將「job」字段放入<a4j:outputPanel/>,然後重新調用outputPanel。

<a4j:outputPanel id="myPanel"> 
    <h:inputText value="#{prevManager.job}" id="job" maxlength="10" size="10" label="#{msg.common_label_job}" required="true" /> 
</a4j:outputPanel/> 

<a4j:commandButton value="Set job to Programmer" reRender="myPanel" immediate="true"> 
    <a4j:actionparam name="jVal" value="Programmer" assignTo="#{prevManager.job}"/> 
</a4j:commandButton> 

更多信息有關<a4j:outputPanel/>here

3

這個問題在JSF 2還確定並詳細此相關答案解釋:How can I populate a text field using PrimeFaces AJAX after validation errors occur?

總結,答案是,你需要清除EditableValueHolder組件的狀態時,它的大約是AJAX渲染但通過調用方法setValue(null),setSubmittedValue(null),setLocalValueSet(false),setValid(true),不包含在ajax-execute中。注意:在JSF 2中,您應該使用便捷方法resetValue()來代替。

鑑於你的「工作」輸入字段的客戶ID prevForm:job,這裏是你如何清除它與相關的動作監聽器方法中的「設置工作,程序員」按鈕:

UIInput input = (UIInput) context.getViewRoot().findComponent("prevForm:job"); 
input.setValue(null); 
input.setSubmittedValue(null); 
input.setLocalValueSet(false); 
input.setValid(true);