2011-03-11 66 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