我试图有条件地渲染一个命令链接。但是我发现在调试bean函数时,stockView.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");
}
}
}
这是StocksView中的hasPortfolios方法(它是一个ViewScoped Bean)。 hasPortfolios变量是私有Map hasPortfolios;
{{1}}
答案 0 :(得分:0)
在我看来,你应该像这样调用函数而不是使用方括号:
rendered="#{stocksView.hasPortfolios(orderBooks.bidOrderId.member.memberId)}
同时确保其公开,并且没有重载版本。
答案 1 :(得分:0)
rendered="#{stocksView.hasPortfolios[orderBooks.bidOrderId.member.memberId].booleanValue()}"
此外,我的地图键/值的顺序错误,因此布尔值实际上是键而不是成员ID。
最后,我调用了getMember()。toString(),它将Member对象作为String返回,而不是通过调用getMember()。getMemberId()返回的实际成员ID字符串。所以hasPortfolios应该看起来像这样:
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");
}
}
}
现在,当有用户的投资组合时,会显示卖出命令链接。
感谢大家的帮助,它指出了我正确的方向。