Будет ли PrimeFaces Dialog Framework нарушать область представления по сравнению с p:dialog?

Я использую PrimeFaces 5.

Я хотел бы открыть диалоговое окно при нажатии кнопки.

<p:commandButton value="add upload" actionListener="#{theForm.openUpload}" >

public void openUpload() {
    this.item = new Item();
    RequestContext.getCurrentInstance().openDialog("uploadForm");
}

There will be a save button in the dialog to save the inputs.

<h:commandButton value="#{text['button.add']}" id="add" styleClass="btn btn-default" actionListener="#{theForm.confirmAdd}"/>

public void confirmAdd() {
    RequestContext.getCurrentInstance().closeDialog("uploadForm");
}

My managed bean is @ViewScoped. Will the command button break the view scope if the dialog is in an external file as done by PrimeFaces Dialog Framework? Whenever I click the "add upload" button, the @PostConstruct method is called again just like the scope is lost.

В разделе комментариев официального блога говорится, что это не нарушит область представления, но здесь форум основного разработчика говорит, что openDialog() создает новое представление, поэтому оно нарушает представление объем.

Кто-нибудь может это подтвердить?


person Yichaoz    schedule 21.10.2014    source источник
comment
Какую версию JSF вы используете? Известно, что javax.faces.bean.ViewScoped ломается при некоторых обстоятельствах. (См. также balusc.blogspot.de/2010/06. /) Если вы используете CDI, вам следует переключиться на javax.faces.view.ViewScoped — это работает, как и ожидалось.   -  person dognose    schedule 22.10.2014


Ответы (3)


Dialog Framework PrimeFaces в основном показывает другое представление в теге <iframe>. Я бы не назвал это нарушением области представления, но диалоговое представление будет иметь свою собственную область видимости, потому что это практически другая страница. Это может быть или не быть желательным в различных обстоятельствах. Как говорится в руководстве пользователя PrimeFaces:

Dialog Framework (DF) используется для открытия внешней страницы xhtml в диалоговом окне, которое создается динамически во время выполнения.

  • p:dialog
    • Exists in the same view scope.
    • Может легко иметь тот же контекст разговора.
    • Статически определенный диалог и его компоненты создаются сразу же при просмотре сборки. Вы можете только отложить рендеринг, например. с dynamic=true.
    • Декларативное определение означает, что оно более удобочитаемо и удобно в сопровождении, потому что существование диалога не скрыто где-то в коде Java.
  • Dialog Framework.
    • Has its own view scope.
    • Разработчик должен беспокоиться о передаче параметров, распространении контекста диалога. (И PF не поддерживал includeViewParams до версии 5.1.)
    • Динамическое создание означает, что диалог и его компоненты не будут созданы до тех пор, пока диалог не будет фактически открыт, но новый диалог будет создаваться каждый раз, когда он открывается. Если диалоговое окно открывается много раз, общее снижение производительности будет больше, а многие представления диалогового окна могут исчерпать лимит представлений JSF и истечь срок действия других представлений.
    • В некоторых случаях императивное динамическое создание позволяет повысить эффективность использования ресурсов. Например. показать один конкретный диалог из десятков на основе пользовательского ввода. Или редко используемый диалог, который можно было открыть с любой страницы приложения.

Я бы рекомендовал использовать p:dialog по умолчанию. Используйте Dialog Framework только в тех случаях, о которых я упоминал в последнем пункте.

person Vsevolod Golovanov    schedule 22.10.2014
comment
очень полезная информация! В итоге я использую p:dialog, потому что это соответствует моему требованию :) - person Yichaoz; 25.10.2014

Это нормально, поскольку вы уже создали экземпляр формы (ManagedBean) в файле main.xhtml. SO область уже используется в main.xhtml. Когда вы щелкнули, чтобы открыть диалоговое окно: диалоговое окно представляет собой новое представление, затем создается новый экземпляр формы (ManagedBean).

person Dhouha BOUSSALEM    schedule 21.10.2014

У нас были некоторые проблемы с @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()
person Henrique dos Santos Goulart    schedule 21.10.2014
comment
Stackoverflow — это не форум, где вы можете захватить несколько тем. Переполнение стека – это сайт Вопросов и ответов, на котором предполагается иметь ОДИН вопрос и много ответов на страницу. Пожалуйста, задайте свой вопрос, даже если это очень похоже на то, о чем этот пост! - person dognose; 22.10.2014
comment
Я думаю, что он не захватывает ветку, он предлагает мне использовать другой пакет, потому что он столкнулся с той же проблемой. - person Yichaoz; 22.10.2014
comment
@Kossel выглядел как вопрос (у нас такая же проблема), но, возможно, вы правы. - person dognose; 22.10.2014
comment
@dognose Я пытался помочь, говоря, что у нас была такая же проблема, и мы использовали омнифейсы для решения нашей проблемы. Извините, проблема была в том, что мой плохой английский -_- говорил в настоящем, когда я хотел бы говорить в прошлом. - person Henrique dos Santos Goulart; 22.10.2014
comment
@henriquedsg89 без проблем. Просто маленькое недопонимание :) - person dognose; 22.10.2014