2011-08-04 25 views
1

今日、コンポーネントの値が変更されたときに、バッキングBeanのメソッドを呼び出すために、今日私は大部分の時間がかかりました。私のコンポーネントが<p:dialog>の外にある場合はすべて正常に動作しますが、ダイアログ内でネストするとサーバー側は決して起こりません。もともと私は<p:calendar>コントロールで作業していましたが、単純なinputTextでも動作しないことに気付きました。次の例では動作します:p:ダイアログ内からajaxイベントを発生させる方法

<h:panelGrid columns="3"> 
    <h:outputText value="Start"/> 
    <p:inputText id="startOfRange" value="#{myBean.startRange}" valueChangeListener="#{myBean.startChanged}"> 
     <p:ajax event="change" update="play"/> 
    </p:inputText> 
    <h:outputText id="play" style="margin-left: 10px;" value="#{myBean.startRange}"/> 
</h:panelGrid> 

私のバッキングBeanのメソッドは、以下のメソッドが呼び出されることは決してありませんように包まれたときに、この方法は、しかし、のinputTextのうちタブの後に呼び出される

public void startChanged(ValueChangeEvent event) { } 

次のようになります。

<p:dialog widgetVar="efDlg" zindex="10" appendToBody="true" header="Create Custom Date Range" 
     modal="true" height="375" width="450" resizable="false" closable="false" > 
<h:panelGrid columns="4"> 
    <h:outputText value="Start"/> 
    <p:inputText id="startOfRange" value="#{myBean.startRange}" valueChangeListener="#{myBean.startChanged}"> 
     <p:ajax event="change" update="play"/> 
    </p:inputText> 
    <h:outputText id="play" style="margin-left: 10px;" value="#{myBean.startRange}"/> 
    <p:inputText id="endOfRange" value="#{myBean.endRange}" valueChangeListener="#{myBean.endChanged}"/> 
</h:panelGrid> 
<div class="customRangeButtons"> 
    <span> 
     <p:commandButton value="Cancel" onstart="efDlg.hide();" actionListener="#{myBean.cancelCustomDateRange}" update="pGraphs"/> 
    </span> 
    <span style="margin-left: 300px;"> 
     <p:commandButton value="Ok" type="submit" onstart="efDlg.hide();" action="#{myBean.saveCustomDateRange()}" update="pGraphs"/> 
    </span> 
</div>  
</p:dialog> 

注意Mojarra 2.1.0でPrimeface 2.2.1を使用しています。値が変更されたときにstartChangedメソッドを呼び出すことができない理由は何ですか?

+0

回避策として、私はp:ダイアログを切り替え、手動でjQueryダイアログを作成しました。それはうまくいきます。 –

+0

これは賢明な選択肢です。 2.2.1が安定版であっても、それは対話コンポーネントと一緒に来る遠い方法を持っています。これらは、ダイアログ内に含まれている場合、特定のコンポーネントビヘイビアが異なるか存在しない共通のテーマです。私が集めたことから、基本的なYUIダイアログが物理的にDOM要素をフォームに出し入れする方法と関係しています。 –

+0

私は ''に大きな問題を抱えています。私はそれが ''を使用するFaceletページでうまく動かないと思います。レイアウトを使用しているかどうかはわかりません。私は彼らが将来のリリースでダイアログを安定させることを望んでいます。 –

答えて

2

たぶん私はこのことについて間違っている(私が確認するために自宅で私のプロジェクトのコードを持っていない)が、これではありません。

<p:ajax event="change" update="play"/> 

がすることになって:

<p:ajax event="valueChange" update="play"/> 

私はAjax eventの値の大部分はJavaScriptイベントハンドラに似ているが、valueChangeはJSF Ajaxタグの特別な値であることがわかっている。

レコードの

、私は時々のinputTextの内側に2個のAjaxの子タグをペアリング、のような:

<p:ajax event="valueChange" process="@this" update="whatever"/> 
<p:ajax event="keyUp" process="@this" update="whatever"/> 

これは、それが同様に入力されたコピー&ペーストとの損失で、各キーストロークに対処します親入力テキストに焦点を当てます。

+1

'event =" valueChange "は本当に特別な意味を持っています。 HTMLテキストボックス、テキストエリア、およびドロップダウンの 'onchange'として、またHTMLラジオボタンとチェックボックスの' onclick'としてレンダリングされます。しかし、この特定のケースでは、 'event =" change "はテキストボックスで使われたのとまったく同じ効果を持ちます。根本的な原因は、おそらく ''に実際には ''(ネストされてはいけません)が必要なことでしょう。少なくともRichFacesには同様の問題があります。 – BalusC

+0

'valueChange'についての説明をありがとう。私はあなたがおそらくダイアログとフォームについて正しいと思います。PrimeFacesのショーケースの例では、独自の形式でダイアログを表示する傾向があります。また、OPが 'appendToBody =" true "'属性を使用しているのを見ています。これは、彼らが抱えている問題の回避策のようです。私のページテンプレートが ''を使用している場合、私はそれを私のwebappで使用しなければなりません。そうしないと、ダイアログが正しくレンダリングされません。多分それは関連しているでしょうか?知りません。 –

0

私も同じ問題を抱えています。私はまた、単一のフォームを使用しており、ダイアログ内にはフォームはありません。私のappendToBody = "true"を持っていない限り、入力値とajaxとsubmitは正しく発生します。その属性にtrueを追加するとすぐに、より適切な/適切なレンダリングのために、入力値は受け入れられません。

関連する問題