3

JSFページで次のフォームを検討してください。

<h:form id="countForm">
  <h:outputText value="#{myBean.count}" />
  <h:commandButton value="Increment the count!">
    <f:ajax listener="#{myBean.increment()}" render="@form" />
  </h:commandButton>
</h:form>

この単純なコードは、ユーザーがajaxリクエストを介してボタンをクリックするたびに、カウンターをインクリメントします。

フォームが更新(レンダリング)されるたびに、カウンターの新しい値を通知するアラートをユーザーに表示したいとします。どうすればいいですか?以下のコードのようなものはありますか?

<h:form onUpdate="alert('the new value is #{myBean.count()}')">

Primefacesの「oncomplete」メソッドを使用できることは知っていますが、イベントはフォームではなくボタンにリンクされるため、それは私が望んでいることではありません。

カウンターは私がやろうとしていることではありません。これは私の問題をよりよく示すための単純な例です。

よろしくお願いします。

4

4 に答える 4

2

正確な要件が明確でないため、正確な答えを提供することは困難です。1.イベントのあるもの
を試しましたか?それはあなたの問題を解決しませんでしたか?2.フォームが再レンダリング された後にスクリプトを実行する必要がある場合は、フォーム内にタグを配置し、以下のようにjavascriptコードをその中に配置できます。<a4j:form>onComplete
<script>

<h:form id="frm">
  <script>
    alert('#{myBean.count()}');
  </script>
</h:form>

このアラートは、フォームがレンダリングされるたびに表示されます。
このJSがページの読み込み時に実行されないようにする必要がある場合は、以下の条件を追加する必要がある場合があることに注意してください。

<head>
  <script>
    var showAlert = false;
  </script>
</head> 
<body>
<h:form id="frm">
  <script>
    if(showAlert) {
      alert('#{myBean.count()}');
    }
    showAlert = true;
  </script>
</h:form>
</body>
于 2012-11-15T04:04:03.833 に答える
1

PrimeFaces<p:ajaxStatus>またはRichFaces :(そのドキュメント<a4j:status>へのリンク)のajaxステータスタグコンポーネントを使用できます。どちらのコンポーネントも、フォームで行われたajax呼び出しからの開始イベントと完了イベントを処理します。

JSF 2アプリケーションでこれらのいずれも試したことはありませんが、PrimeFacesを使用することをお勧めします(少なくともドキュメントはRichFacesよりも優れています)。JSF 1.2 + RichFaces 3.3アプリケーションでRichFacesを使用<a4j:status>して、ajaxリクエストのダイアログをユーザーに表示/非表示にしました。それはこのように見えました(そしてあなたにアイデアを与えることができます):

<a4j:status onstart="Richfaces.showModalPanel('mdpWaitMessage')" 
    onstop="Richfaces.hideModalPanel('mdpWaitMessage')" />
<!-- defining the modal (popup) panel to show the user there was an ajax action -->
<rich:modalPanel id="mdpWaitMessage" resizeable="false" zindex="5000"
    minHeight="30" minWidth="10" height="70" width="150">
    <f:facet name="header">
        <h:outputText value="#{aplicacion.waitMessageTitle}" />
    </f:facet>
    <h:graphicImage value="#{aplicacion.waitMessagePath}" />
    <h:outputText value="#{aplicacion.waitMessageDescription}" />
</rich:modalPanel>
于 2012-11-15T06:31:57.270 に答える
0

を見てみましょうjavax.faces.event.PreRenderComponentEvent.

<h:form id="myForm">
  <f:event type="preRenderComponent"
           listener="#{someActionListener}" />
</h:form>

フォームを(再)レンダリングするたびに、actionListenerが最初に呼び出されます。

于 2012-11-14T22:23:47.700 に答える
0

あまりエレガントではない方法が1つありますが、他の方法がないというシナリオで使用しています。<h:panelGroup>ブロックを含むを使用していて、パーツの一部で<script>panelGroupIDを使用していますrender=<f:ajax

<h:form id="countForm">
  <h:outputText value="#{myBean.count}" />
  <h:commandButton value="Increment the count!">
    <f:ajax listener="#{myBean.increment()}" render="postAjax" />
  </h:commandButton>
  <h:panelGroup id="postAjax">
    <script>
     //...
    </script>
  </h:panelGroup>
</h:form>

がまたはのpanelGroup中にある場合、これはうまく機能しないことに注意してください。ui:repeatdatatable

于 2012-11-15T11:40:56.930 に答える