Jsf 与p:Dialog相比,PrimeFaces对话框框架会破坏视图范围吗?

Jsf 与p:Dialog相比,PrimeFaces对话框框架会破坏视图范围吗?,jsf,primefaces,dialog,view-scope,Jsf,Primefaces,Dialog,View Scope,我用的是PrimeFaces5 我想在按下按钮时打开一个对话框 <p:commandButton value="add upload" actionListener="#{theForm.openUpload}" > 对话框中将有一个保存按钮来保存输入 <h:commandButton value="#{text['button.add']}" id="add" styleClass="btn btn-default" actionListener="#{theForm.co

我用的是PrimeFaces5

我想在按下按钮时打开一个对话框

<p:commandButton value="add upload" actionListener="#{theForm.openUpload}" >
对话框中将有一个保存按钮来保存输入

<h:commandButton value="#{text['button.add']}" id="add" styleClass="btn btn-default" actionListener="#{theForm.confirmAdd}"/>
我的托管bean是
@ViewScoped
。如果对话框像PrimeFaces对话框框架一样位于外部文件中,命令按钮是否会中断视图范围?每当我单击“添加上载”按钮时,就会再次调用
@PostConstruct
方法,就像范围丢失一样

注释部分说它不会破坏视图范围,但是说
openDialog()
创建一个新视图,因此它破坏了视图范围


有人能确认一下吗?

这很正常,因为您已经在main.xhtml中实例化了表单(ManagedBean)。因此,该范围已在main.xhtml中使用。
当您单击打开对话框时:对话框是一个新视图,然后创建一个新的表单实例(ManagedBean)。

我们在
JBoss 7.1/Mojarra 2.1.7
中的
@ViewScoped
出现了一些问题,我们改为
Omnifaces

我建议您使用
@org.omnifaces.cdi.ViewScoped
而不是
@javax.faces.bean.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()
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()
我使用您的示例进行了测试,您可以在日志中看到差异:

使用
@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()
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()
使用
@javax.faces.bean.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()
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()

PrimeFaces的对话框框架基本上显示了
标记中的另一个视图。我不会称之为破坏视图范围,但对话框视图将有自己的范围,因为它实际上是一个不同的页面。这在不同的情况下可能是可取的,也可能不是可取的。正如PrimeFaces的用户指南所说:

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

  • p:对话
    • 存在于同一视图范围中
    • 可以轻松地拥有相同的对话上下文
    • 按照静态定义,对话框及其组件将在“生成”视图中立即创建。只能延迟渲染,例如使用
      dynamic=true
    • 声明性定义意味着它更具可读性和可维护性,因为对话框的存在并没有隐藏在java代码中的某个地方
  • 对话框框架。
    • 有自己的视图范围
    • 开发人员必须担心传递参数、传播对话上下文。(PF直到5.1才提供支持。)
    • 动态创建意味着对话框及其组件在对话框实际打开之前不会被创建,但每次打开时都会创建一个新对话框。如果多次打开该对话框,总的性能损失将更大,加上许多对话框视图可能会耗尽JSF视图限制并使其他视图过期
    • 命令式动态创建允许在某些情况下提高资源效率。例如,根据用户输入显示几十个对话框中的一个。或者是一个很少使用的对话框,可以从应用程序的任何页面打开

我的建议是默认使用p:dialog。仅在上一个要点中提到的情况下使用对话框架。

Stackoverflow不是一个可以劫持某些线程的论坛。Stack overflow是一个问答网站,每页都有一个问题和多个答案-请提出你自己的问题,即使它与本文非常相似!我认为他并没有劫持线程,他建议我使用另一个包,因为他面临同样的问题problem@Kossel看起来像一个问题(我们有同样的问题),但你可能是对的。@dognose我试图帮助说我们有同样的问题,我们用全方位解决我们的问题。对不起,问题是我现在的英语说得不好,而我想在过去说话。@henriquedsg89没问题。只是一个小小的误解:)你使用的是哪个版本的JSF?已知在某些情况下,
javax.faces.bean.ViewScoped
会中断。(另请参见)如果您使用的是CDI,则应切换到
javax.faces.view.ViewScoped
-这与预期的一样有效。非常有用的信息!我最终使用了p:dialog,因为它符合我的要求:)