有条件地渲染p:dataGrid及其内容

时间:2011-03-08 17:39:13

标签: jsf primefaces rendering

我正试图根据会话bean属性有条件地隐藏或显示<p:dataGrid>。我的<p:dataGrid>被包装在一个p:对话框中,我想我可以使用p:dialog的closeListener和onCloseUpdate属性来控制<p:dataGrid>的隐藏/显示。我在p:dataGrid的呈现属性中使用基于会话的bean boolean属性,在我的<p:remoteCommand>的{​​{1}}方法中设置为true,然后在{{1}中设置为false }。即使执行了loadImages方法并且boolean属性设置为true,它也永远不会被渲染。理想情况下,如果actionListener="#{bookmarklet.loadImages}"为空,我想呈现closeListener="#{bookmarklet.close}"。我试过了<p:dataGrid>,但我得到了EL异常。

页:

value="#{bookmarkletBean.imageURLs}"

会话bean:

rendered="#{!empty bookmarkletBean.imageURLs}"

动作类:

<p:dialog header="#{bundle['bookmarklet.dialog.HEADER']}" widgetVar="scrapeDlg" modal="true" height="450" width="700" draggable="false" resizable="false" closeListener="#{bookmarklet.close}" onCloseUpdate="imageGrid">    
    <h:form id="scrapeFrm">
        <p:commandButton onclick="rcTest()" value="call server"/>
        <h:inputHidden id="scrapeURL" value="http://www.freefoto.com/preview/04-01-70?ffid=04-01-70"/>
        <p:remoteCommand name="rcTest" process="@this,scrapeURL" actionListener="#{bookmarklet.loadImages}" update="imageGrid"/>
        <p:dataGrid id="imageGrid" var="img" value="#{bookmarkletBean.imageURLs}" columns="1" rows="1" paginator="true" effect="true" 
                                paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} " 
                                paginatorPosition="bottom"
                                rendered="#{bookmarkletBean.shouldRender}"> 
             <p:column>  
                 <h:panelGrid columns="1" style="width:100%">  
                     <p:graphicImage value="#{img}" width="100" height="100"/>   
                 </h:panelGrid>  
             </p:column>  
        </p:dataGrid>
    </h:form>
</p:dialog>

1 个答案:

答案 0 :(得分:4)

问题是,当您最初将组件呈现值设置为false时,它在页面上不存在。在imageGrid上调用update时,没有找到要更新的组件。

您需要做的是将<p:dataGrid>包裹在<p:ouputPanel>中并更新<p:outputPanel>而不是<p:dataGrid>

<h:form id="scrapeFrm">
    <p:commandButton onclick="rcTest()" value="call server"/>
    <h:inputHidden id="scrapeURL" value="url"/>
    <p:remoteCommand name="rcTest" update="imageGrid" process="@this,scrapeURL" actionListener="#{bookmarklet.loadImages}" />
    <p:outputPanel id="imageGrid">
        <p:dataGrid var="img" rendered="#{bookmarkletBean.shouldRender} value="#{bookmarkletBean.imageURLs}""> 
            ...
        </p:dataGrid>
     </p:outputPanel>
</h:form>