我最近改变了我所有的bean从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"
不起作用,因为在支持bean media_browser.xhtml
点击按钮时,将立即被初始化,并且没有。
难道我做错了什么?
使用PrimeFaces 3.5.0。
已经发现了一些很简单的解决方法:
让我们引用在此的其他问题BalusC的回答是: 跳过执行<用户界面:包括>当父UI组件不会被渲染
所述<ui:include>
运行为在视图生成时一taghandler,而所呈现的属性视图期间评估渲染时间。
关于他的第一个建议:
- 使用视图编译时间标签等
<c:if>
周围<ui:include>
一部分。
因此,首先增加一些新的方法,以你的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请求,对话框将不会被更新。但是,如果你触发你的对话
<p:commandButton id="addId" value="Add" title="Add" type="button"
oncomplete="dlgMultiFileSelect.show();" update=":yourDlg"/>
和更新它的内容,它最终会被渲染!
请注意以下更改: 号码:对话ID, 电话号码:更新的commandButton和p:的commandButton的onComplete
Facelet标记用户界面:包括将得到早些时候在循环处理,因此它得到初始化。 如果你想更新按钮,单击该对话框的内容,你需要做的所以使用您的commandButton更新=“对话框的ID”。 您可以使用您的用户界面:包括让页面不初始加载。