【问题标题】:Open Primefaces dialog and Process Full JSF Lifecycle打开 Primefaces 对话框并处理完整的 JSF 生命周期
【发布时间】:2011-03-11 20:52:10
【问题描述】:

我正在执行<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 方法中尝试清除的上一个值。任何想法...下面的代码...

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

}

【问题讨论】:

    标签: jsf jsf-2 primefaces


    【解决方案1】:

    真的不知道这种行为的原因是什么,但您可以尝试以下方法:

    对于&lt;p:outputPanel id="searchPnl"&gt;:尝试在面板上而不是h:outputTextp:dataGrid上设置渲染标签。

    对于 searchText 尝试更新 &lt;p:outputPanel id="searchTxtPnl"&gt; 而不是 h:inputText

    【讨论】:

      【解决方案2】:

      我注意到您的 bean 的范围是请求。如果您执行 ajax 更新,这确实需要是带有 JSF @ManagedBean 和 @ViewScoped 注释的 ViewScoped bean。

      另一件事:确保您没有更新对话框所在的表单。这可能会产生不需要的结果。

      【讨论】:

      • 我的所有对象数据都有会话范围的 bean。请求范围的 bean 只有 action 和 actionListener 方法。基于请求的 bean 获得了会话范围内的“数据”bean 的注入实例。我想通过新的视图范围,我可以组合这些类。你怎么看?
      • 抱歉回复晚了,但是是的,我会将它们合并到一个视图范围的 bean 中。但请记住,CDI 没有视图范围,因此您必须使用 JSF 2.0 注释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2010-12-06
      • 2014-04-08
      • 2015-12-30
      相关资源
      最近更新 更多