0

私はプライムフェイスのメニューとタブコントロール(データテーブル付き)を備えたxhtmlページを持っています。データテーブルは、「タイプ」変数(Bean内)に基づいて値を取得します。各メニュー項目をクリックすると、アクションが起動され (onType("param"))、タイプ変数が bean に設定されます (以下を参照)。しかし、tabView でタブを選択すると、型変数が再び null に設定されます。なぜこれが起こるのですか。

xhtml コード:

    <h:form id="frm">
  <p:menu>
    <p:menuitem value="price losers" action='#{equityBean.onType("losers")}'/>
    <p:menuitem  value="price gainers"/>
    <p:menuitem  value="price volume"/>
  </p:menu>
  <p:tabView activeIndex="#{equityBean.activeIndex}">
    <p:ajax event="tabChange" listener="#{equityBean.onChange}" update=":frm"/>
    <p:tab title="NSE">                   

      <p:dataTable value="#{equityBean.scripList}" var="scrip">
        ....                        
      </p:dataTable>
    </p:tab>
    <p:tab title="BSE">
      <p:dataTable value="#{equityBean.scripList}" var="scrip">
        .....
      </p:dataTable>
    </p:tab>
  </p:tabView>
</h:form>

ビーンコード:

public void onType(String type)
{
    this.type=type;
}

public void onChange(TabChangeEvent event) {
    exchange=event.getTab().getTitle();
}
   public List<MasterScrip> getScripList() {
      if(type!=null)
      {
       if(type.equalsIgnoreCase("losers"))
       {
        scripList=new ArrayList<MasterScrip> ();
     scripList=getScripByPriceLosers(exchange);
        return scripList;
       }
       else if(type.equalsIgnoreCase("gainers"))
       {
        scripList=new ArrayList<MasterScrip> ();
     scripList=getScripByPriceLosers(exchange);
        return scripList;
       }
       else
       {
           scripList=new ArrayList<MasterScrip> ();
     scripList=getScripByVolumeType(exchange);
       return scripList;
       }
      }
      else
      {
          scripList=new ArrayList<MasterScrip> ();
     scripList=getScripByVolumeType(exchange);
       return scripList;
      }
    }

どこで間違っていますか?

編集済み (web.xml) :

    <context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>true</param-value>
</context-param>
4

1 に答える 1

2

として宣言された Bean は、@ViewScoped時々@RequestScopedBean のように動作し、リクエストまたはポストバックごとに再作成されます。理由は、この優れたブログ投稿で説明されています: @ViewScoped fails in tag handlers

参照記事には、考えられる解決策がいくつかリストされています。値をセッション スコープに保存し、それをビュー/リクエスト スコープの Bean にのみ注入することもできます。

于 2012-05-25T07:15:54.883 に答える