1

新しい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は特定の時間に登録する必要がありますか?omn​​ifacesの例では、{pre | post} InvokeActionイベントが常にf:metadataタグで子として宣言されていることに気付きました。

次のように、preRenderViewイベントがf:metadataの外部で宣言されている例をたくさん見つけました:http ://www.mkyong.com/jsf2/jsf-2-prerenderviewevent-example/

ちなみに、私がこのように進んでいるのが明らかに間違っているなら、私はあなたの知恵から学んでうれしいです。しかし、私は避けたい:

  • ap:commandButtonアクションハンドラーによってトリガーされるバッキングBeanメソッドのチェーン呼び出しを行う。
  • そのようなすべてのアクションハンドラーをcommandButtonのaf:actionListener子として宣言します。

もっとイベント志向の方法を探しています。

4

1 に答える 1

1

InvokeActionEventListenerショーケースで言及および示されているように、このイベントはUIViewRoot、、およびでUIFormのみ機能します。したがって、(ビュー上で)汎用フックが必要な場合は、それをに配置する必要があります。これは、に配置して行う必要があります。UIInputUICommandUIViewRoot<f:metadata>

preRenderComponentおよびは特定の親コンポーネントを必要としません。preRenderViewビュー内のどこにでも配置でき、常に最も近い親UIコンポーネントに登録されます。すべての種類のコンポーネントがinvokeアクションに参加するわけではないため、これはpreInvokeAction/にとってあまり意味がありません。たとえば、それを配置することは、あまり自己文書化されていなかったでしょう。postInvokeAction<h:panelGroup>

于 2012-11-07T11:03:35.933 に答える