Условно отрендерить ap: dataGrid и его содержимое - PullRequest
1 голос
/ 08 марта 2011

Я пытаюсь условно скрыть или показать <p:dataGrid> на основе свойства сессионного компонента. Мой <p:dataGrid> обернут в диалог p: и я подумал, что мог бы использовать атрибуты closeListener и onCloseUpdate для p: диалогового окна, чтобы управлять скрытием / показом <p:dataGrid>. Я использую логическое свойство bean-компонента на основе сеанса в атрибуте рендеринга p: dataGrid, который устанавливается в true в моем методе <p:remoteCommand> s actionListener="#{bookmarklet.loadImages}", а затем в false в closeListener="#{bookmarklet.close}". Он никогда не обрабатывается, даже если метод loadImages выполняется, а логическое свойство имеет значение true. В идеале я хотел бы сделать <p:dataGrid>, если value="#{bookmarkletBean.imageURLs}" пусто. Я попытался rendered="#{!empty bookmarkletBean.imageURLs}", но получил исключение EL.

страница:

<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>

сессионный компонент:

@Named
@Scope("session")
public class BookmarkletBean extends BaseSessionBean{
    private List<String> imageURLs;
    private boolean shouldRender;
    private String hidden;


    public String getHidden() {
        return hidden;
    }

    public void setHidden(String hidden) {
        this.hidden = hidden;
    }

    public List<String> getImageURLs() {
        return imageURLs;
    }

    public void setImageURLs(List<String> imageURLs) {
        this.imageURLs = imageURLs;
    }

    public boolean isShouldRender() {
        return shouldRender;
    }

    public void setShouldRender(boolean shouldRender) {
        this.shouldRender = shouldRender;
    }
}

класс действия:

@Named
@Scope("request")
public class Bookmarklet extends BaseAction{
    @Inject
    private BookmarkletBean bookmarkletBean;
    @Inject
    private BookmarkletService bookmarkletService;

    public void loadImages(ActionEvent e) throws MalformedURLException, IOException {
        ExternalContext context = FacesUtils.getExternalContext();
        String scrapeURL = context.getRequestParameterMap().get("scrapeFrm:scrapeURL");
        bookmarkletBean.setImageURLs(bookmarkletService.scrape(scrapeURL));
        bookmarkletBean.setShouldRender(true);
    }

    public void close(CloseEvent e){
        bookmarkletBean.setShouldRender(false);
    }
}

1 Ответ

4 голосов
/ 08 марта 2011

Проблема заключается в том, что, когда вы изначально устанавливаете значение компонента в значение false, оно не существует на странице.Когда вызывается обновление для imageGrid, не найдено ни одного компонента для обновления.

Что вам нужно сделать, это обернуть <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>
...