PrimeFaces对话框延迟加载(dynamic =“true”)不起作用?

时间:2013-05-14 10:46:25

标签: jsf jsf-2 primefaces jstl lazy-loading

我最近将所有咖啡豆从RequestScoped更改为ViewScoped。突然间,延迟加载对话框不起作用。我正在使用PrimeFaces JSF库。

<html>
<h:body>
<f:view>    
    <h:form>
        <p:commandButton id="addId" value="Add" title="Add" type="button" onclick="dlgMultiFileSelect.show();"/>
        ...
    </h:form>    
    <p:dialog header="Dialog" widgetVar="dlgMultiFileSelect" modal="true" resizable="true" dynamic="true"> 
        <ui:include src="/dialogs/media_browser.xhtml"/>
    </p:dialog>
</f:view>   
</h:body>
</html>

似乎dynamic="true"不起作用,因为media_browser.xhtml中的支持bean立即被初始化,而不是单击按钮时。

我做错了吗?

使用PrimeFaces 3.5.0。

2 个答案:

答案 0 :(得分:3)

找到了一些非常简单的解决方法:

让我们引用BalusC对这个问题的回答: Skip executing <ui:include> when parent UI component is not rendered

  

<ui:include>在视图构建时运行为标记处理程序,而在视图渲染时评估渲染属性。

关于他的第一个提议:

  1. <c:if>部分周围使用<ui:include>之类的视图构建时标记。
  2. 首先在bean中添加一些新方法。 (甚至可能在某些应用程序范围的bean中用于重用)

    public boolean isAjaxRequest() {
        boolean val = FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest();
        return val;
    }
    

    然后将<ui:include>括在<c:if>之后:

    <p:dialog id="yourDlg" header="Dialog" widgetVar="dlgMultiFileSelect" modal="true" resizable="true" dynamic="true"> 
        <c:if test="#{applicationBean.ajaxRequest}">
            <ui:include src="/dialogs/media_browser.xhtml"/>
        </c:if>
    </p:dialog>
    

    因此,在页面加载时,请求不是ajax ...而在基页上的其他ajax请求中,对话框将不会更新... 但是如果你触发对话

    <p:commandButton id="addId" value="Add" title="Add" type="button" 
        oncomplete="dlgMultiFileSelect.show();" update=":yourDlg"/>
    

    并更新它的内容,它最终会被渲染!

    请注意以下更改: p:对话框ID p:commandButton update p:commandButton oncomplete

答案 1 :(得分:0)

Facelet标签ui:include将在周期的早期进行处理,因此它会被初始化。如果要在按钮单击时更新对话框的内容,则需要使用commandButton上的update =“对话框id”来执行此操作。您可以使用您的ui:include,以便最初不加载页面。