9

processタグの属性を指定するp:ajaxとリスナーが実行されません。属性を省略した場合process、リスナーは期待どおりに呼び出されます。

ビューのスニペットは次のとおりです。

<p:messages id="messages" />
<h:inputText id="inputToProcess" value="#{controller.inputToProcess}" />
<p:selectBooleanCheckbox id="testCheckbox" >
  <p:ajax event="change" process="inputToProcess"
    update="messages @this inputToUpdate"
    listener="#{controller.processChecked}" />
</p:selectBooleanCheckbox>
<h:inputText id="inputToUpdate" value="#{controller.inputToUpdate}" />

そしてコントローラー:

@javax.faces.bean.ManagedBean
@javax.faces.bean.ViewScoped
public class Controller implements Serializable {
  private String inputToProcess;
  private String inputToUpdate;
  //getters and setters

  public void processChecked(javax.faces.AjaxBehaviorEvent e) {
    // doing some stuff here
  }
}

PhaseIdphaseListenerを使用してビューに を添付しました。これが私が観察したものです。ANY_PHASE

processattributeを指定すると、モデルの更新フェーズ中にinputToProcess入力の値がコントローラーに正常に設定されます (例外は発生しません)。次にフェーズInvoke ApplicationRender Responseフェーズが実行されますが、リスナーは呼び出されません。私が気づいたことの1つは、最後にチェックボックスが設定されていないことです。Update Modelしかし、前述したようにフェーズとInvoke Applicationフェーズが実行されるため、変換エラーや検証エラーはありません。

属性を省略した場合process、次のように表示されます。リスナーは通常、Invoke Applicationフェーズ中に呼び出され (immediateデフォルトでは false であるため)、その後 `Render Response が実行されます。チェックボックスが正常に設定されました。

この種の動作について何か説明はありますか?

4

1 に答える 1

16

一見するとうまくいくはずです。少なくとも、標準の JSF コンポーネントを使用する場合は、この方法で問題なく動作します。アクションコンポーネントがprocess. に追加@thisするprocessと解決するはずです。問題の報告を PrimeFaces 関係者に投稿することを検討してください。

さらに、event="valueChange"or を使用するか、完全に削除するevent="click"代わりに、デフォルトですでに正しい値になっています(チェックボックスとラジオボタンのコンポーネントでレンダリングされます)。MSIE では、チェックボックスとラジオボタンの場合、イベントの動作が異なります。2回目以降のクリックでのみトリガーされます。ブラウザに依存したくありません。event="change"eventvalueChangeonclickchange


あなたのコメントによると:

標準の JSF チェックボックスと ajax コンポーネントの問題は、Process Validations フェーズでリスナーが呼び出されることですが、最初にモデルを更新する必要があります。

本当じゃない。おそらく、あなたはvalueChangeListener代わりに使用し<f:ajax listener>たり、他のものと混同したりしていました. は、<f:ajax listener>アクションの呼び出しフェーズで常に呼び出されます。

于 2012-04-23T20:24:27.590 に答える