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

Yic*_*aoz 7 jsf dialog primefaces view-scope

我正在使用PrimeFaces 5.

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

<p:commandButton value="add upload" actionListener="#{theForm.openUpload}" >
Run Code Online (Sandbox Code Playgroud)

public void openUpload() {
    this.item = new Item();
    RequestContext.getCurrentInstance().openDialog("uploadForm");
}
Run Code Online (Sandbox Code Playgroud)

对话框中将有一个保存按钮以保存输入.

<h:commandButton value="#{text['button.add']}" id="add" styleClass="btn btn-default" actionListener="#{theForm.confirmAdd}"/>
Run Code Online (Sandbox Code Playgroud)

public void confirmAdd() {
    RequestContext.getCurrentInstance().closeDialog("uploadForm");
}
Run Code Online (Sandbox Code Playgroud)

我的托管bean是@ViewScoped.如果对话框在PrimeFaces对话框架中的外部文件中,命令按钮是否会破坏视图范围?每当我点击"添加上传"按钮时,@PostConstruct就会再次调用该方法,就像范围丢失一样.

在的注释部分官方博客中表示,它不会打破的视图范围内,但这里核心开发者论坛上说,openDialog()创建一个新的观点,因此它打破了看法范围.

有人能证实吗?

Vse*_*nov 8

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

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

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

我的建议是默认使用p:dialog.仅在我上一个要点中提到的情况下使用Dialog Framework.