我有一个我不明白的问题: 我要求一个新网站。站点有一个用于打开对话框的链接。链接在表单内。 对话框不在表单内。
简化代码示例:
<p:outputPanel id="layout-center" >
<h:form>
<p:commandLink id="option_field_user_profile" actionListener="#{controllerBean.getBean('userProfileBean', component).init}" oncomplete="#{controllerBean.getBean('userProfileBean', component).show}" >
<h:outputText value="#{msg.mProfile}"/>
</p:commandLink>
</h:form>
</p:outputPanel>
<p:dialog header="#{userPreferencesBean.header}" widgetVar="#{userPreferencesBean.widgetVar}" appendToBody="#{userPreferencesBean.appendToBody}" resizable="#{userPreferencesBean.resizable}" id="#{userPreferencesBean.xhtmlId}" dynamic="#{userPreferencesBean.dynamic}" modal="#{userPreferencesBean.modal}" closable="#{userPreferenceBean.closable}">
<ui:include src="/WEB-INF/templates/modification/userPreferences.xhtml" />
</p:dialog>
UserPreferencesBean位于ViewScope中。我的问题是现在来自UserPreferencesBean的@PostConstruct方法被非回发请求调用两次,即Bean被构造两次,尽管它应该是相同的视图。如果我在表单中移动对话框以进行测试,则会像预期的那样调用一次。但由于对话框有自己的形式,这肯定不是解决方案。 当网站加载并且我点击F5时,PostConstruct方法执行一次。
有人有想法吗?
答案 0 :(得分:1)
这是因为您在id
的视图构建时属性<p:dialog>
中引用了视图范围的bean属性。如果您将id
修复为静态,或者引用请求或应用程序范围的bean属性,那么您的视图范围bean将按预期运行。
id
和binding
属性。