2011-03-11 22 views
0

我正在做<p:commandLink value="#{bundle['registered.home.search.TEXT']}" onclick="webSearchDlg.show();"></p:commandLink>以显示下面的对话框。 p:outputPanel id =“searchPnl”总是在最初呈现后呈现。即使执行了对话框closeListener="#{dreamSearch.close}" onCloseUpdate="searchTxtPnl,searchPnl",它也不会消失。在关闭对话框后打开对话框时,出现panelGrid,<p:inputText id="searchText">显示我试图在下面的closeListener方法中清除的以前的值。任何想法...下面的代码...打开Primefaces对话框和Process Full JSF生命周期

<p:dialog header="#{bundle['dreamSearch.HEADER']}" 
    widgetVar="webSearchDlg" modal="true" styleClass="dialog dialog2" 
    draggable="false" resizable="false" showEffect="fade" 
    hideEffect="fade" closeListener="#{dreamSearch.close}" onCloseUpdate="searchTxtPnl,searchPnl"> 
    <div class="dialog-top-reg"></div> 
    <div class="dialog-middle-reg"> 
     <div class="close-button"> 
      <h:form> 
       <p:commandButton onclick="webSearchDlg.hide()" /> 
      </h:form> 
     </div> 
     <h:form class="dialog-content dialog-content2" 
      binding="#{dreamSearch.dreamSearchFrm}"> 
      <h1 class="dream-search"> 
       <h:outputText value="#{bundle['dreamSearch.HEADER']}" /> 
      </h1> 
      <p class="dream-search"> 
       <h:outputText value="#{bundle['dreamSearch.SUBHEADER']}" /> 
      </p> 
      <div class="dream-search-wrap"> 
       <fieldset> 
       <p:outputPanel id="searchTxtPnl"> 
        <p:inputText id="searchText" value="#{dreamSearchBean.searchText}"/> 
       </p:outputPanel> 
        <p:commandButton styleClass="form-btn1" 
         value="#{bundle['dreamSearch.search.button.TEXT']}" onclick="webImageSearch()"/> 
       </fieldset> 
      </div> 
      <p:remoteCommand name="webImageSearch" process="searchText, @this" actionListener="#{dreamSearch.search}" update="searchPnl"/> 
      <p:outputPanel id="searchPnl" styleClass="data-grid-wrap"> 
       <h:outputText value="#{bundle['dreamSearch.imageResults.TEXT']}" rendered="#{dreamSearchBean.shouldRender}"/> 
       <p:dataGrid var="img" value="#{dreamSearchBean.images}" columns="5" 
        rows="10" paginator="true" effect="true" 
        paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
        rowsPerPageTemplate="10,15,20" paginatorPosition="bottom" rendered="#{dreamSearchBean.shouldRender}"> 
        <p:column> 
         <h:panelGrid columns="1" style="width:100%"> 
          <p:graphicImage value="#{img}" width="40" height="50" /> 
         </h:panelGrid> 
        </p:column> 
       </p:dataGrid> 
      </p:outputPanel> 
     </h:form> 
    </div> 
    <div class="dialog-bottom-reg"></div> 
</p:dialog> 


@Named 
@Scope("request") 
public class DreamSearch extends BaseAction { 
    @Inject 
    DreamService dreamService; 
    @Inject 
    ImageSearchService flickrSearchImpl; 
    @Inject 
    private DreamSearchBean dreamSearchBean; 
    private UIForm dreamSearchFrm; 


    public void init(){ 
     if (!FacesUtils.isPostback()) { 
      dreamSearchBean.setShouldRender(false); 
      dreamSearchBean.setSearchText(null); 
     } 
    } 

    public void setDreamSearchFrm(UIForm dreamSearchFrm) { 
     this.dreamSearchFrm = dreamSearchFrm; 
     init(); 
    } 

    public void search(ActionEvent e){ 
     try { 

      if(dreamSearchBean.getSearchText() != null && !dreamSearchBean.getSearchText().isEmpty()){ 
       List<String> searchResults = flickrSearchImpl.searchByKeyWord(dreamSearchBean.getSearchText()); 
       dreamSearchBean.setImages(searchResults); 
       dreamSearchBean.setShouldRender(true); 
      }else{ 
       dreamSearchBean.setShouldRender(false); 
      } 

     } catch (Exception e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

    } 

    public void close(CloseEvent e){ 
     dreamSearchBean.setShouldRender(false); 
     dreamSearchBean.setSearchText(null); 
    } 

    public UIForm getDreamSearchFrm() { 
     return dreamSearchFrm; 
    } 
} 

    @Named 
@Scope("session") 
public class DreamSearchBean extends BaseSessionBean { 
    private List<String> images; 
    private String searchText; 
    private boolean shouldRender; 



    public String getSearchText() { 
     return searchText; 
    } 

    public void setSearchText(String searchText) { 
     this.searchText = searchText; 
    } 

    public boolean isShouldRender() { 
     return shouldRender; 
    } 

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

    public List<String> getImages() { 
     return images; 
    } 

    public void setImages(List<String> images) { 
     this.images = images; 
    } 

} 

回答

1

真的不知道这种现象的原因是什么,但你可以尝试以下方法:

对于<p:outputPanel id="searchPnl">:尝试设置渲染标记在面板上,而不是h:outputTextp:dataGrid

对于搜索文本尝试更新<p:outputPanel id="searchTxtPnl">而不是h:inputText

0

我注意到你的bean的范围是请求。如果您正在做Ajax更新,那么确实需要使用JSF @ManagedBean和@ViewScoped批注的ViewScoped bean。

另一件事:确保你没有更新对话框所在的窗体。这可能会产生不想要的结果。

+0

我有我所有对象数据的会话范围的bean。请求作用域bean只有action和actionListener方法。基于请求的bean已经获得了会话作用域“数据”bean的注入实例。我想用新的视图范围我可以结合类。你怎么看? – c12 2011-03-19 01:08:13

+0

对不起,回复迟了,但是我会将它们合并到视图范围的bean中。但请记住CDI没有视图范围,所以您将不得不使用JSF 2.0注释。 – 2011-04-06 18:19:13