ここでは、コアの問題です。JSF:ajaxリクエストで必要なフィールドをリフレッシュする方法
ページ。私は2つの「入力テキスト」が必要です。 Beanの値を変更し、「ジョブ」オブジェクトをreRenderesするコマンドボタン。
ここ<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のドキュメントによると、私が見つかりました:
ここでは一例であり、動作が正しくありません。私は仕事と名前を記入する必要があります。 Form2:動作が正しいです。私は正しい値を見るために仕事をいっぱいにする必要はありません。Ajaxの領域がキーのAjaxコンポーネントです。 ajaxリクエストが来たときに、サーバ上で処理されるコンポーネントの部分を 側に限定して 側に制限します。 処理は、 のデコード、検証、およびモデル更新の間の呼び出しを意味します。 フェーズ。 領域を使用する最も一般的な理由は、次のとおり指定されたAJAXリクエストに不要な他のフォーム入力 の検証中にJSFライフサイクル処理の強制終了を-avoiding
。 - イベントが配信されるときに異なる戦略を定義する (immediate = "true/false") - ajaxステータスの個別インジケータを表示する - レンダリング処理のパフォーマンスを向上させる (selfRendered = "true/false"検証エラーがAJAX入力を処理することを可能に ない場合 renderRegionOnly =「真/偽」)
次の2つの例は、 状況を示しています。 名前を入力します。 outputText コンポーネントは、後で再表示されます。 ただし、最初のケースでは、 の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:
残念ながら、Ajax領域を使用しても、私のフィールドは両方とも必須であるため、実際には悪い方法で使用されています。これは主な違いです。
多くのありがとうございます。
無効なコンポーネントを処理しています。私は有効なコンポーネントの値を変更する必要があります...私はbeanの値を変更して、私は更新を強制することはできません(即時、reRender、ajaxRegion、それでは失敗しません)。私が見つけた唯一の方法は、プロセスプロパティを使用することです。この場合、コンポーネントは正しく更新されますが、IfとOnlyが初期値を持っている場合(つまり、コンポーネントがnull値ではない場合)だから、強制する方法はありません。 – Tama
ajaxSingle = "true"をボタンに置き、入力コンポーネントを再描画します。 –
正しく動作しません。 – Tama