1

私のコードベースの古き良き時代には、イベントの再キューイングにかなり依存していました。これは、標準で指定された動作ではなく、ICEfacesまたはMyFacesの実装の詳細が原因で機能したと思われます。私たちが頻繁に行っていたのは、この種のことでした。

<ice:inputText value="#{bb.frequency}" valueChangeListener="#{bb.valueChanged}"/>

目標は、頻度が変わるたびretuneに呼び出されるように手配することです。setFrequency

次に、イベントを再キューイングするかなり嫌なコードがバッキングBeanに含まれていました。通常は次のようになります。

class BB {
  // this happens first, thanks to UPDATE_MODEL_VALUES
  public void setFrequency(Frequency f) {
    this.model.f = f;
  }

  public void valueChanged(ValueChangeEvent event) {
    if (event.getOldValue().equals(event.getNewValue())
      return; // nothing changed, so leave

    if (FacesContext.getCurrentInstance().getPhaseId() != INVOKE_APPLICATION) {
      OurMagicEventUtils.requeueEvent(event, INVOKE_APPLICATION);
    }
    else {
      // do the post-setter work here (the setter happened recently during 
      // UPDATE_MODEL_VALUES so we're up-to-date by here
      this.model.retune();
    }
  }
}

これは生きるのに良い方法ではありません。後のフェーズでイベントを再キューイングするための信頼できる方法を見つけられませんでした。それは明らかに、人々が行うようなことではありません。私は2つの解決策を見ます:

  1. リチューンインテリジェンスをBB#setFrequencyメソッドに移動します。

    私は下位レベルのモデルクラスに直接対応しており、他のクライアントの動作を妨げたくないため、多くの場合、これを回避することはできません。

  2. カスタムコンポーネントを作成し、ロジックをsetFooそこのメソッドに移動します。

    他のコンテナに埋め込むと、Mojarraやカスタムコンポーネントに多くの問題があるため、これは好きではありません。また、私がしなければならないことにはやり過ぎのようです。文字通り、retuneいくつかのプロパティを設定した後に呼び出す必要があります。

  3. すべてのバッキングBeanを作成します。ほとんどのメソッドを直接内部に委任しますがsetFoo、そこで再調整をキャッチして実行します。これは私たちが以前行っていたものと非常に似ており、ボイラープレート、ラッパー、グルーコードがたくさんあることを意味するので、私はそれが好きではありません。

私の頭の中で私はこのようなものを想像します:

<ice:inputText value="#{bb.frequency}" afterChange=#{bb.retune}"/>

しかし、それは明らかに機能しません。また<f:actionListener>、クラス名が必要ですが、現在行っていることとは関連付けられていないため、アタッチすることもできません。さらに、そうでないものにのみ設定できUICommandますUIInput

このジレンマを解決するためのエレガントで正しい方法は何ですか?

4

1 に答える 1

2

すでにJSF2を使用しているので、を使用してください<f:ajax>

<ice:inputText value="#{bb.frequency}">
    <f:ajax listener="#{bb.retune}"/>
</ice:inputText>

public void retune(AjaxBehaviorEvent event) { // Note: the argument is optional.
    // ...
}

changeこれは、HTMLDOMイベントが発生した呼び出しアクションフェーズ中に呼び出されます。

于 2012-11-28T23:33:51.153 に答える