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

Dan*_*jel 4 jsf jstl lazy-loading primefaces jsf-2

我最近把我所有的豆子从RequestScoped改为ViewScoped。突然间,对话框的延迟加载不起作用了。我正在使用PrimeFacesJSF 库。

<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>
Run Code Online (Sandbox Code Playgroud)

似乎dynamic="true"不起作用,因为支持 beanmedia_browser.xhtml会立即初始化,而不是在单击按钮时初始化。

难道我做错了什么?

使用 PrimeFaces 3.5.0。

小智 5

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

让我们引用 BalusC 对另一个问题的回答: Skipexecuting <ui:include>whenparentUIcomponentisnotrendered

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

关于他的第一个建议:

  1. <c:if>使用类似于零件周围的视图构建时间标签<ui:include>

因此,首先向您的 bean 添加一些新方法。(甚至可能在某些应用程序范围的 bean 中有用以供重用)

public boolean isAjaxRequest() {
    boolean val = FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest();
    return val;
}
Run Code Online (Sandbox Code Playgroud)

然后附上<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>
Run Code Online (Sandbox Code Playgroud)

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

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

并更新它的内容,它终于可以渲染了!

请注意以下更改:p:dialog idp:commandButton updatep:commandButton oncomplete