新しいJSF2.1搭載アプリケーションで、コンポジット、タグ、またはカスタムコンポーネントを使用しています。
私は今でも、このテクノロジーを進めるための正しい(または少なくとも推奨される)方法を無視することがよくあります。
ユーザーが「保存」ボタンをクリックしたときに、コンポーネントに何らかのアクションを実行させたいのですが。実際には、保存ボタンはPrimefacesコマンドボタンです。
だから、私は次のようなボタンコードを使用しています:
<p:commandButton id="example" type="submit" value="Confirmer les modifications" process="targetComponent" update="<compoents to update list>">
<f:param name="save" value="true>
</p:commandButton>
「保存」ボタンと私のコンポーネントでは、preRenderComponentを使用してhandleSubmitバッキングBeanメソッドをトリガーします。
<f:event type="preRenderComponent" listener="#{myBeautifulBean.handleSubmit}"/>
handleSumitは次のようになります。
public void handleSubmit() {
FacesContext context = FacesContext.getCurrentInstance();
String saveMandats = JSFUtils.getRequestParameter("save");
if(context.isPostback() && !context.isValidationFailed() && (saveMandats != null) && !saveMandats.isEmpty())
confirmeModifsSelection();
}
これは動作します。
スタックオーバーフローを読み、@ BalusCのアドバイスに従って、Omnifaces(1.2)を使用し、OmniFacesのInvokeActionEventListener
ショーケースで説明されている理由でpostInvokeActionイベントを使用しようとしています。
そこで、イベントタグを次のように変更します。
<f:event type="postInvokeAction" listener="#{myBeautifulBean.handleSubmit}"/>
...そしてmyBeautifulBean.handleSubmitが呼び出されることはありません。
もちろん、私は依存関係としてオムニフェイスを持っており、他のコンポーネント(バリデーターなど)は正しく機能します。InvokeActionListenerは適切に初期化されています(または私にはそう思われます)。
postInvokeActionは特定の時間に登録する必要がありますか?omnifacesの例では、{pre | post} InvokeActionイベントが常にf:metadataタグで子として宣言されていることに気付きました。
次のように、preRenderViewイベントがf:metadataの外部で宣言されている例をたくさん見つけました:http ://www.mkyong.com/jsf2/jsf-2-prerenderviewevent-example/
ちなみに、私がこのように進んでいるのが明らかに間違っているなら、私はあなたの知恵から学んでうれしいです。しかし、私は避けたい:
- ap:commandButtonアクションハンドラーによってトリガーされるバッキングBeanメソッドのチェーン呼び出しを行う。
- そのようなすべてのアクションハンドラーをcommandButtonのaf:actionListener子として宣言します。
もっとイベント志向の方法を探しています。