4

我最近将我所有的豆子从 更改RequestScopedViewScoped。突然,对话框的延迟加载不起作用。我正在使用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>

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

难道我做错了什么?

使用 PrimeFaces 3.5.0。

4

2 回答 2

4

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

让我们引用 BalusC 对另一个问题的回答: Skip execution <ui:include> when parent UI component is not render

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

关于他的第一个提议:

  1. <c:if>在部件周围使用视图构建时间标签<ui:include>

所以首先向你的 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

于 2013-09-25T10:47:29.170 回答
0

Facelet 标记 ui:include 将在循环的早期处理,因此它正在初始化。如果要在单击按钮时更新对话框的内容,则需要使用命令按钮上的 update="id of the dialog" 来完成。您可以为您的 ui:include 使用,以便最初不加载页面。

于 2013-05-17T10:10:37.763 回答