2011-03-08 3 views
1

J'essaie de masquer sous conditions ou d'afficher un <p:dataGrid> basé sur une propriété bean session. Mon <p:dataGrid> est enveloppé dans une boîte de dialogue p: et j'ai pensé que je pouvais utiliser les attributs closeListener et onCloseUpdate de p: dialog pour contrôler le masquage/show du <p:dataGrid>. J'utilise une propriété bean beanean basée sur la session dans l'attribut de rendu du p: dataGrid qui est défini sur true dans la méthode de actionListener="#{bookmarklet.loadImages}", puis défini sur false dans le closeListener="#{bookmarklet.close}". Il n'est jamais rendu même si la méthode loadImages est exécutée et la propriété boolean est définie sur true. Idéalement, je voudrais rendre le <p:dataGrid>, si le value="#{bookmarkletBean.imageURLs}" est vide. J'ai essayé rendered="#{!empty bookmarkletBean.imageURLs}" mais j'ai une exception EL.Rendu conditionnel d'un p: dataGrid et de son contenu

page:

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

:

@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; 
    } 
} 

classe d'action:

@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); 
    } 
} 

Répondre

4

Le problème est lorsque vous définissez d'abord un des composants rendus valeur à false, il n'a pas existe sur la page. Lorsque la mise à jour est appelée sur imageGrid, aucun composant n'est mis à jour.

Qu'est-ce que vous avez à faire est envelopper le <p:dataGrid> dans un <p:ouputPanel> et mettre à jour le <p:outputPanel> au lieu de votre <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> 
+0

ouais j'ai c12

+0

@colin Ah .. ok mis à jour ma réponse. – Mark

+0

Merci pour l'aide! J'ai été en mesure de l'obtenir pour rendre conditionnellement en utilisant votre suggestion ci-dessus, mais comment pourrais-je cacher le panneau à nouveau? J'ai essayé d'utiliser le closeListener de la boîte de dialogue = "# {bookmarklet.close}" onCloseUpdate = "imageGrid" puis dans la méthode bookmarklet.close j'ai défini "shouldRender" sur false mais lorsque la boîte de dialogue s'ouvre à nouveau, le panneau est déjà rendu. Des idées? – c12