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



我最近把我所有的豆子从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.

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

让我们引用BalusC对这个问题的回答:跳过执行当父UI组件不呈现

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

关于他的第一个提议:

  1. <ui:include>部分周围使用<c:if>这样的视图构建时间标签。

所以首先在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:dialog idp:commandButton updatep:commandButton oncomplete

Facelet标签ui:include将在周期的早期得到处理,因此它正在初始化。如果您想在单击按钮时更新对话框的内容,那么您需要在命令按钮上使用update="对话框的id "。你可以在ui:include中使用,这样页面就不会被加载。

相关内容

  • 没有找到相关文章

最新更新