与p:对话相比,PrimeFaces对话框架是否会破坏视图范围?

时间:2014-10-21 17:02:44

标签: jsf primefaces dialog view-scope

我正在使用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()会创建一个新视图,因此会破坏视图范围。

有人可以证实吗?

3 个答案:

答案 0 :(得分:8)

PrimeFaces&#39; Dialog Framework基本上显示<iframe>标记中的另一个视图。我不打算打破视图范围,但对话视图将拥有它自己的范围,因为它实际上是一个不同的页面。在不同的情况下这可能是也可能不是。正如PrimeFaces&#39;用户指南说:

  

Dialog Framework(DF)用于在a中打开外部xhtml页面   在运行时动态生成的对话框。

  • 号码:对话
    • 存在于相同的视图范围内。
    • 可以轻松拥有相同的对话背景。
    • 静态定义,在构建视图中立即创建对话框及其组件。你只能延迟渲染,例如使用dynamic=true
    • 声明性定义意味着它更具可读性和可维护性,因为对话框的存在不会隐藏在java代码中的某处。
  • 对话框架。
    • 有自己的观点范围。
    • 开发人员必须担心传递参数,传播会话上下文。 (并且PF直到5.1才支持includeViewParams。)
    • 动态创建意味着对话框及其组件不会被创建,直到对话框实际打开,但每次打开时都会创建一个新对话框。如果对话框多次打开,则总体性能下降会更大,而且许多对话框视图会耗尽JSF视图限制并使其他视图失效。
    • 在某些情况下,势在必行的动态创建可以提高资源效率。例如。根据用户输入显示数十个特定对话框。或者很少使用的对话框,可以从应用程序的任何页面打开。

我的建议是默认使用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()