2017-01-10 11 views
0

私は条件付きでコマンドリンクをレンダリングしようとしています。しかし、私は、beans関数のデバッグ時に、株式のview.hasfolioが呼び出されないことを発見しました。これはユーザーレンダリングの正しい方法ですか、別の方法でこれを行う必要がありますか?primefacesコマンドラインを条件付きでレンダリング

<h:form id="form"> 
     <p:dataGrid id="prices" var="orderBooks" value="#{stocksView.latestPricesResults}" columns="3" rows="12"> 
       <f:facet name="header"> 
        WST 100 
       </f:facet> 
       <p:column> 
       <p:panel header="#{orderBooks.bidOrderId.member.memberId}"> 
      <h:panelGrid columns="1"> 
      <h:outputText value="#{orderBooks.price}" /> 
      <h:outputText value="#{orderBooks.bidOrderId.member.party}" /> 
      <h:outputText value="#{orderBooks.lastUpdate}" /> 
      <p:commandLink update=":form:buyDetail" oncomplete="PF('buyDialog').show()" title="View Detail"> 
       <h:outputText value="Buy"/> 
       <f:setPropertyActionListener value="#{orderBooks}" target="#{stocksView.selectedStock}" /> 
      </p:commandLink> 
      <p:commandLink update=":form:sellDetail" oncomplete="PF('sellDialog').show()" title="View Detail" rendered="#{stocksView.hasPortfolios[orderBooks.bidOrderId.member.memberId]}"> 
       <h:outputText value="Sell"/> 
       <f:setPropertyActionListener value="#{orderBooks}" target="#{stocksView.selectedStock}" /> 
      </p:commandLink> 
      </h:panelGrid> 
      </p:panel> 
      </p:column> 
      </p:dataGrid> 
</h:form> 

これはStocksView(ViewScoped Bean)のhasPortfoliosメソッドです。 hasPortfolios変数はプライベートMap hasPortfoliosです。私の目に

public void hasPortfolios(){ 

    hasPortfolios = new HashMap<Boolean,String>(); 
     Collection<Portfolio> portfolios = user.getTrader().getPortfolios(); 
     Iterator<Portfolio> iter = portfolios.iterator(); 
     while(iter.hasNext()){ 
      Portfolio p = iter.next(); 
      if(p.getBalance() == 0){ 
       hasPortfolios.put(false, p.getMember().toString()); 
       logger.log(Level.INFO, "hasPortfolios false"); 
      } 
      else 
      { 
       hasPortfolios.put(true,p.getMember().toString()); 
       logger.log(Level.INFO, "hasPortfolios true"); 
      } 
     } 
} 
+0

バッキングビーン 'stockView'と変数 'stocksView.hasPortfolios'の詳細を表示できますか? –

+0

ありがとうtam nguyen、私はそのメソッドを追加しました – zobbo

答えて

0

いつものように私はいくつかのことを間違っていました。まず、私のマップは、レンダリングされた属性にBooleanオブジェクトを返します。これはbooleanプリミティブでなければなりません。だから私は、ブールが実際にキーの代わりに、会員IDだったので、また、私は間違っているために、私のマップキー/値を持っていたにbooleanValue()

rendered="#{stocksView.hasPortfolios[orderBooks.bidOrderId.member.memberId].booleanValue()}" 

を呼び出すことを周りに取得します。

最後に、getMember()。getMemberId()を呼び出して返される実際のメンバーID文字列ではなく、MemberオブジェクトをStringとして返すgetMember()。toString()を呼び出していました。したがって、ポートフォリオは実際には次のようになります。

public void hasPortfolios(){ 

    logger.log(Level.INFO, "hasPortfolios start"); 

    hasPortfolios = new HashMap<String,Boolean>(); 
     Collection<Portfolio> portfolios = user.getTrader().getPortfolios(); 
     Iterator<Portfolio> iter = portfolios.iterator(); 
     while(iter.hasNext()){ 
      Portfolio p = iter.next(); 
      if(p.getBalance() == 0){ 
       hasPortfolios.put(p.getMember().getMemberId(),new Boolean(false)); 
       logger.log(Level.INFO, "hasPortfolios false"); 
      } 
      else 
      { 
       hasPortfolios.put(p.getMember().getMemberId(),new Boolean(true)); 
       logger.log(Level.INFO, "hasPortfolios true"); 
      } 
     } 
} 

ユーザーのポートフォリオがある場合、Sellコマンドリンクがレンダリングされるようになりました。

ご協力いただきありがとうございます。それは正しい方向に私を指摘しました。

0

あなたの代わりに角括弧を使用してのこのような関数を呼び出す必要があります:

rendered="#{stocksView.hasPortfolios(orderBooks.bidOrderId.member.memberId)} 

また必ずその公開すると、それのオーバーロードバージョンがありません。

+0

Maciej Kowalskiありがとう、私はそれを試みましたが、メソッドはまだ実行されません。 – zobbo

関連する問題