我正在使用 PrimeFaces 5。
我想在按下按钮时打开一个对话框。
<p:commandButton value="add upload" actionListener="#{theForm.openUpload}" >
public void openUpload() {
this.item = new Item();
RequestContext.getCurrentInstance().openDialog("uploadForm");
}
对话框中将有一个保存按钮来保存输入。
<h:commandButton value="#{text['button.add']}" id="add" styleClass="btn btn-default" actionListener="#{theForm.confirmAdd}"/>
public void confirmAdd() {
RequestContext.getCurrentInstance().closeDialog("uploadForm");
}
我的托管 bean 是@ViewScoped
。如果对话框位于外部文件中(如 PrimeFaces 对话框框架所做的那样),命令按钮是否会破坏视图范围?每当我单击“添加上传”按钮时,@PostConstruct
方法被再次调用,就像范围丢失一样。
评论区的官方博客说它不会破坏视图范围,但是这里是论坛的核心开发者 says openDialog()
创建一个新视图,因此它破坏了视图范围。
有人可以证实这一点吗?
PrimeFaces 的对话框架基本上显示了另一个视图<iframe>
标签。我不会称之为破坏视图范围,但对话框视图将有它自己的范围,因为它实际上是一个不同的页面。在不同的情况下这可能是可取的,也可能不是可取的。正如 PrimeFaces 的用户指南所述:
对话框框架(DF)用于在a中打开外部xhtml页面
在运行时动态生成的对话框。
p:dialog
- 存在于同一视图范围内。
- 可以轻松地拥有相同的对话上下文。
- 静态定义的对话框及其组件在视图构建时立即创建。您只能延迟渲染,例如与一个
dynamic=true
.
- 声明性定义意味着它更具可读性和可维护性,因为对话框的存在没有隐藏在 java 代码中的某个地方。
对话框架
- 有自己的视图范围。
- 开发人员必须担心传递参数、传播对话上下文。 (而且PF不支持包含视图参数直到 5.1。)
- 动态创建意味着对话框及其组件在对话框实际打开之前不会被创建,但每次打开时都会创建一个新对话框。如果多次打开对话框,总的性能损失将会更大,而且许多对话框视图可能会耗尽 JSF 视图限制并使其他视图过期。
- 命令式动态创建在某些情况下可以提高资源效率。例如。根据用户输入显示数十个对话框中的一个特定对话框。或者一个很少使用的对话框,可以从应用程序的任何页面打开。
我的建议是默认使用 p:dialog。仅在像我在最后一个要点中提到的情况下才使用对话框框架。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)