有条件地渲染一个 primefaces 命令链接
Posted
技术标签:
【中文标题】有条件地渲染一个 primefaces 命令链接【英文标题】:Conditionally rendering a primefaces commandlink 【发布时间】:2017-05-25 11:27:27 【问题描述】:我正在尝试有条件地呈现命令链接。但是我在调试 bean 函数时发现,stockView.hasPortfolios 从未被调用过。这是用户渲染的正确方式还是我应该以其他方式执行此操作?
<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 中的 hasPortfolios 方法(它是一个 ViewScoped Bean)。 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");
【问题讨论】:
你能显示更多关于支持 bean 'stockView' 和变量类型 'stocksView.hasPortfolios' 的细节吗? 谢谢 tam nguyen,我已经添加了那个方法 【参考方案1】:在我看来,你应该像这样调用函数而不是使用方括号:
rendered="#stocksView.hasPortfolios(orderBooks.bidOrderId.member.memberId)
还要确保它是公开的并且没有它的重载版本。
【讨论】:
感谢 Maciej Kowalski,我试过了,但方法仍然没有执行。【参考方案2】:像往常一样,我做错了一些事情。首先,我的地图在渲染属性中返回一个布尔对象,这必须是一个布尔基元。所以为了解决这个问题,我调用 booleanValue()
rendered="#stocksView.hasPortfolios[orderBooks.bidOrderId.member.memberId].booleanValue()"
此外,我的地图键/值顺序错误,因此布尔值实际上是键而不是成员 ID。
最后,我调用了 getMember().toString(),它将成员对象作为字符串返回,而不是通过调用 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");
现在,当用户有投资组合时,会呈现 Sell 命令链接。
感谢大家的帮助,它为我指明了正确的方向。
【讨论】:
以上是关于有条件地渲染一个 primefaces 命令链接的主要内容,如果未能解决你的问题,请参考以下文章