2016-04-19 18 views
0

私の現在のプロジェクトでは、承認ワークフローを通じて値を変更できるエンティティがあります。 エンティティの新しいバージョンを保存する場合は、ボタンをクリックするとダイアログがポップアップします。ここであなたの変更を承認するように設定することができます。フォームの値は送信されず、ajaxでリセットされます

私の問題は、このダイアログの値が送信されないことです。

ダイアログはメインテンプレートに含まれていますが、メインフォームの外にあります。

<p:dialog id="idEntityCommentDialog" 
     header="#{msgs['label.approval.dialogHeader.'.concat(bean.targetStatus)]}" 
     width="350" widgetVar="entityCommentDlg" modal="true" 
     maximizable="false" resizable="false" appendTo="@(Body)"> 

両方のフィールドがBeanをバックアップsessionScoped内部のオブジェクトにその値を設定します:sekectOneMenu:私は標準JSFコントロール、時間があったが、前に

<p:selectOneMenu id="selUsers" 
    value="#{bean.state.releasedBy}" style="width: 100%"> 
    <f:selectItems value="#{bean.fetchUserList()}" var="user" 
     itemValue="#{user.id}" 
     itemLabel="#{user.name}" /> 
</p:selectOneMenu> 

<p:inputTextarea id="changeComment" 
    value="#{bean.state.newComment.eventDescription}" 
    style="width: 98%; height: 100px"> 
    <f:converter converterId="xssConverter" /> 
</p:inputTextarea> 

ダイアログが次のように、ボディに追加されますh:inputTextArea。それぞれのプライムフェイスコントロールに切り替えましたが、少なくともselectOneMenuの値が送信されましたが、inputTextareaの値はまだ送信されません。私は使用されたコンバータでブレークポイントを設定し、私はそれを使用する別の場所で動作する私のコンバータで空の文字列を受け取る。

Iは、更新パラメータの様々な組み合わせを試して、私はPを使用する場合、私はまた

<p:ajax event="change" update="@this"> 

介しAJAXリクエストに値を設定しようとした:AJAXタグを、私が見ることができる、私は、値を変更したときにajaxリクエストの後、値は変更前の元の値に直ちにリセットされます。これは両方のフィールドに適用されます(標準コントロールを使用する場合)私が言ったように、私はprimefacesコントロールで固定しました(私は理由は分かりませんが、うまくいくようですが)inputTextAreaでは機能しません。

マイボタンは、プライムフェースからツールバーファセットとともに挿入されます。

<p:commandButton actionListener="#{bean.saveEntity}" 
    styleClass="toolbarButton" update="dialogForm2 :blocker:contentWrapper" 
    onstart="PF('waitDialog').show();" 
    oncomplete="PF('waitdialog').hide();PF('entityCommentDlg').hide();" 
    value="#{msgs['label.approval.button.'.concat(bean.targetStatus)]}"> 
</p:commandButton> 

フォームはちょうどidのダイアログ内で定義されていますので、そこに、AJAXコントロール、私の値は直ちにリセットされていること:私は私がpを使用する場合は、そのほとんどが混乱しています

<h:form id="dialogForm2"> 

ここでは何か非常に間違っているに違いない。

何らかの理由で(phaseListener経由で)表示されない可能性がある検証の失敗も確認しましたが、そうでない場合、facesMessagesは発生しません。

私はプロジェクトから完全なコードを表示することはできませんが、私の顧客はそれを望んでいませんが、他のコードやアーキテクチャについてさらに詳しい情報が必要な場合は、私はそれを提供しようとします。いくつかのIDと名前も変更しましたが、元のコードで正しく参照されていることを確認しました。

このような動作の原因は何でしょうか? 提出されていないフォームの値についてのさまざまな記事があり、私はそれらを見て解決策を試しましたが、ここでは何もうまくいかないようです。私の同僚も、なぜそれがうまくいかないのか分かりません。私は、アプリケーションの別の部分でほぼ同じ構築体(異なるバッキングBeanとオブジェクトを持つ)を使用しています。そこには、標準のjsfコントロールがすべて正常に機能します。

+0

この情報は役に立ちましたか? http://stackoverflow.com/q/2118656「完全なチャンク」を投稿する場合は、最初にそれを行うべきではありません。一般に、問題に寄与しない無関係なノイズ(マークアップ、スタイリング、i18nなど)がたくさん含まれています。サンドボックスプロジェクトで問題を再現し、copy'n'paste'n'runnable MCVEに沸かせてください。また、http://stackoverflow.com/tags/jsf/info – BalusC

+0

も参照してください。残念ながら、私はリストのすべての点をチェックして何も適用されません。しかし、私はポイント9で完全にはわかりません。はい、ダイアログは以前に更新されています。パラメータ(bean.targetStatus)を設定し、ダイアログを更新し、次にonCompleteイベントでダイアログを開きます。 しかし、私のcommandButtonは今のところうまく動作します。 actionListenerのメソッドは正常に動作し、他のフォーム(更新したい元のエンティティ)のすべての値が送信されるので、ここでは問題はないと思いますか? –

答えて

0

私はついにこの問題を発見しました。解決策はappendTo = "@(Body)"を削除することでした

私は解決策を見つける前に非常に奇妙な動作をしました。

送信ボタンのonStartイベントとonCompleteイベントで、表示されているオーバーレイが表示されます。バグが発生しました。固定このローディングオーバーオールです。私がコピーを取る前に、現在のページに存在しなかった間違ったローディングオーバーレイを参照した貼り付けエラー&がありました。しかし、私が正しいオーバーレイを使用した場合にのみ、またはこのオーバーレイへの参照を完全に削除した場合でも、バグが発生しました。オーバーレイの間違ったIDを再び入れると、それは機能しました...

ここで、appendTo属性を削除すると、正しいロードオーバーレイさえすべて正常に動作しているようです。私はなぜappendTo属性を使用したのかも分かりません。私は前にダイアログが別の場所にあったと仮定し、それを使用しなければなりませんでしたが、ダイアログはレイアウトやフォームの外に直接ドキュメントの本体に配置されていました。

誰かが、このエラーがなぜ起こったのか、より教育的な考えを持っていますか?私はappendToはあなたがそれを使う必要がないときに副作用を持つことができると理解していますが、私がここで観察できる一般的な振る舞いは何の理由もありません。

+0

私はそれがこの1つだと思います:http://stackoverflow.com/q/18958729 – BalusC

関連する問題