好的,在這裏你是核心問題。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區域並沒有幫助(事實上我用它糟糕的方式...),因爲我的字段都是必需的。這是主要的不同。
有什麼想法?
非常感謝。
我不是在無效組件上工作。我只需要改變一個有效的組件的值...我改變了bean的值,我不能強制更新(immediate,reRender,ajaxRegion等等)。我發現的唯一方法是使用process屬性。在這種情況下,組件被正確更新,但是如果並且僅當它具有初始值(我的意思是:組件具有非空值)。因此,無法強制... – Tama 2011-01-12 09:18:44
將ajaxSingle =「true」放在按鈕上,然後重新渲染輸入組件。 – 2011-01-13 00:24:55