2

アプリケーションに ap:selectOneMenu があり、選択が行われると、さまざまなアクションを実行するために、さまざまなマネージド Bean から複数のバックエンド メソッドを呼び出す必要があります。

XHTML コード:

<p:selectOneMenu id="selectMenu" value="#{userBean.selectedSite}"
  converter="siteConverter" style="width:150px">
  <p:ajax event="change" listener="#{bean2.changeSite}"
    render="@form :comp1 :comp2 :comp3 :comp4" />
  <f:selectItems value="#{userBean.sites}" var="site"
    itemValue="#{site}" itemLabel="#{site.description}" />
  <p:ajax event="change" listener="#{bean1.reset}" 
    update="@form :comp1 :comp2 :comp3 :comp4" />
</p:selectOneMenu>

マネージド Bean 1:

@ManagedBean(name="bean1")
@ViewScoped
public class Bean1 implements Serializable {
  // ...
  public void reset() {
    loadEvents();
    resetEvent();
  }
}

マネージド Bean 2:

@ManagedBean(name="bean2")
@SessionScoped
public class Bean2 implements Serializable {
  // ...
  public void changeSite() {
    FacesContext context = FacesContext.getCurrentInstance();
    Bean1 bean = (Bean1) context.getApplication().evaluateExpressionGet(context, "#{bean1}", Bean1.class);
    reload();
    bean.loadEvents();
  }
}

2 つの異なる p:ajax コンポーネントを使用する代わりに、Bean1 から単一のメソッドを呼び出す単一の p:ajax を使用すると、「更新」の下にリストされているページ コンポーネントが正しく更新されません。

XHTML:

<p:ajax event="change" listener="#{bean1.singleMethod}" 
  update="@form :comp1 :comp2 :comp3 :comp4" />

マネージド Bean 1:

@ManagedBean(name="bean1")
@ViewScoped
public class Bean1 implements Serializable {
  // ...
  public void () singleMethod() {
    FacesContext context = FacesContext.getCurrentInstance();
    Bean2 bean = (Bean2) context.getApplication().evaluateExpressionGet(context, "#{bean2}", Bean2.class);
    bean2.changeSite();
    reset();
  }
}

選択した値を変更すると、サーバー側のオブジェクトが更新されますが、ページは更新されません。F5 キーを押すと、ページに実際の状況が表示されます。

4

1 に答える 1

0

単一のグローバル メソッドをセッション スコープの Bean (Bean2) に移動すると、その作業が行われます。

于 2013-10-14T10:17:40.813 に答える