2011-01-11 7 views
4

ここでは、コアの問題です。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のドキュメントによると、私が見つかりました:

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:

ここでは一例であり、動作が正しくありません。私は仕事と名前を記入する必要があります。 Form2:動作が正しいです。私は正しい値を見るために仕事をいっぱいにする必要はありません。

残念ながら、Ajax領域を使用しても、私のフィールドは両方とも必須であるため、実際には悪い方法で使用されています。これは主な違いです。

多くのありがとうございます。

答えて

0

a4j:actionparamを使用すると値が設定されますが、この場合は検証をバイパスするのに役立ちません。検証はコンポーネントで実行されます(Beanプロパティではありません)。したがって、送信すると、コンポーネントの値はまだ空です。お役に立てれば。

+0

無効なコンポーネントを処理しています。私は有効なコンポーネントの値を変更する必要があります...私はbeanの値を変更して、私は更新を強制することはできません(即時、reRender、ajaxRegion、それでは失敗しません)。私が見つけた唯一の方法は、プロセスプロパティを使用することです。この場合、コンポーネントは正しく更新されますが、IfとOnlyが初期値を持っている場合(つまり、コンポーネントがnull値ではない場合)だから、強制する方法はありません。 – Tama

+0

ajaxSingle = "true"をボタンに置​​き、入力コンポーネントを再描画します。 –

+0

正しく動作しません。 – Tama

0

「ジョブをプログラマに設定」をクリックすると、メッセージコンポーネントを再描画しないため何も起こりません。これを行うと、検証メッセージが表示されます。

その<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> 

*私はここに「ajaxSingle」必要だと思ういけない...

たぶん、あなたはimmediateを使用して...という新たな問題を得ることができ、豆の値は、(MAYBE!)更新されません。それが発生した場合は、手動でBean値を設定するBeanメソッドを作成します。

それ以外の場合は、Bean値が更新され、フィールドがまだ空の場合は、「ジョブ」フィールドを<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

+0

私はちょうど試しました。まあ、immediate = "true"は、期待どおりにBeanを更新しません。解決策になる可能性がありますが、ユーザーが失われる可能性があります。送信後の検証エラーにより、フィールドが以前の値にリセットされます。 – Tama

+0

申し訳ありませんが、私はあなたのコメントを理解できませんでしたが、すぐに検証されません。その理由は、私はそれが値を取得し、手動でクラスに設定するために、Beanのメソッドを作って、Beanの値を更新しない場合、言った。この後、フォーム提出の後で、クラスはロードされ、フィールドはBeanクラス値(value = "#{prevManager.job}")を取得するため、フィールドはリセットされません。 – Renan

3

この問題は、JSF 2で特定し、この関連の回答で詳細に説明されています。答えはあなたはそれがAJAX-レンダリングされようとしていたときにEditableValueHolderコンポーネントの状態をクリアする必要があるということですHow can I populate a text field using PrimeFaces AJAX after validation errors occur?

に要約すると、ただし、ajax-executeには含まれていません。メソッドを呼び出すことにより、、setSubmittedValue(null)setLocalValueSet(false)setValid(true)を呼び出します。注意: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); 
関連する問題