我正在使用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
方法,就像范围丢失一样。
{{}}的评论部分表示它不会破坏视图范围,但official blog表示openDialog()
会创建一个新视图,因此会破坏视图范围。
有人可以证实吗?
答案 0 :(得分:8)
PrimeFaces&#39; Dialog Framework基本上显示<iframe>
标记中的另一个视图。我不打算打破视图范围,但对话视图将拥有它自己的范围,因为它实际上是一个不同的页面。在不同的情况下这可能是也可能不是。正如PrimeFaces&#39;用户指南说:
Dialog Framework(DF)用于在a中打开外部xhtml页面 在运行时动态生成的对话框。
dynamic=true
。我的建议是默认使用p:对话框。仅在我上一个要点中提到的情况下使用Dialog Framework。
答案 1 :(得分:1)
这是正常的,因为你已经在main.xhtml中实例化了theForm(ManagedBean)。因此范围已在main.xhtml中使用。 单击以打开对话框时:对话框是一个新视图,然后创建一个新的theForm实例(ManagedBean)。
答案 2 :(得分:0)
我们@ViewScoped
中的JBoss 7.1/Mojarra 2.1.7
遇到了一些问题,我们更改为Omnifaces
我建议您使用@org.omnifaces.cdi.ViewScoped
代替@javax.faces.bean.ViewScoped
我测试了你的例子和日志,你可以看到差异:
使用@org.omnifaces.cdi.ViewScoped
18:58:40,887 INFO [xxx.TheForm] (http-localhost-127.0.0.1-8080-2) @postconstruct
18:58:40,890 INFO [xxx.TheForm] (http-localhost-127.0.0.1-8080-2) openUpload()
使用@javax.faces.bean.ViewScoped
19:01:19,753 INFO [xxx.TheForm] (http-localhost-127.0.0.1-8080-5) @postconstruct
19:01:19,753 INFO [xxx.TheForm] (http-localhost-127.0.0.1-8080-5) @postconstruct
19:01:19,754 INFO [xxx.TheForm] (http-localhost-127.0.0.1-8080-5) openUpload()