有条件地渲染一个 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 命令链接的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地渲染 <f:facet>?

Primefaces p:tee水平无法正常工作和渲染

反应路由器链接以有条件地渲染按钮

PrimeFaces

如何使用渲染更新PrimeFaces中的LayoutUnit?

如何根据条件使primefaces datatable列可编辑