1

わからない問題があります。新しいサイトをリクエストします。サイトには、ダイアログを開くリンクがあります。リンクはフォーム内にあります。ダイアログはフォーム内にありません。

簡略化されたコード例:

    <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 メソッドが非ポストバック要求で 2 回呼び出されることです。つまり、Bean は同じビューである必要がありますが、2 回構築されます。テスト目的でダイアログをフォーム内に移動すると、予想どおり、一度呼び出されます。しかし、ダイアログには独自のフォームがあるため、これは確かに解決策ではありません。サイトが読み込まれ、F5 キーを押すと、PostConstruct メソッドが 1 回実行されます。

誰かアイデアはありますか?

4

1 に答える 1

1

idこれは、 のビュー ビルド時間属性でビュー スコープ Bean プロパティを参照したために発生します<p:dialog>。を静的に修正するidか、代わりにリクエストまたはアプリケーション スコープの Bean プロパティを参照するように修正すると、ビュー スコープの Bean は期待どおりに動作します。

以下も参照してください。

于 2012-10-20T12:56:47.823 に答える