私は自分のアプリケーションでどのスコープを使用するべきかを扱うのが本当に困難です。ビューからマネージドBeanを初期化する
私は初期ビューレイアウトにaを使用してPrimefaceを使用しています。レイアウトの外には、多くの異なるマネージドBeanで使用されるダイアログがあります。
レイアウト内には、ヘッダー、フッター、左側のナビゲーション、中央の現在のビューがあります。次のように私の見解はなります
<h:body id=body">
<p:layoutUnit id=head" position="top">
<ui:insert name="header">
</p:layoutUnit>
<p:layoutUnit id=head" position="bottom">
<ui:insert name="footer">
</p:layoutUnit>
<p:layoutUnit id=head" position="left">
<ui:insert name="menu">
</p:layoutUnit>
<p:layoutUnit id=head" position="right">
<ui:insert name="main">
</p:layoutUnit>
<p:dialog widgetVar="addAddressDialog" header="Add New Address">
<h:form id="insertAddress">
<h:inputText id="insert_address" label="Address" />
</h:form>
</p:dialog>
<p:dialog widgetVar="updateAddressDialog" header="Add New Address">
<h:form id="updateAddress">
<h:inputText id="update_address" value=#{addressBean.selectedAddress.address" />
</h:form>
</p:dialog>
私のアプリケーションは、最初のビューがロードされているので、addressBeanの@PostConstructが呼び出さなっているロードするときに私が午前問題があります。 @PostConstructでは、contactIdという特定のIDに関連付けられたアドレスのリストを初期化します。この時点では、contactIdはインスタンス化されていません。これは、ユーザーが「メイン」ビューとやりとりすると起こります。
AddressBeanのMy Scopeは、contactIdが初めて設定されたときにのみ検索を実行する@ViewScopeです。その後、@PostConstructは決して再び呼び出されず、ビューがスコープから外れないように見えるため、contactIdが変更された場合でも、取り込まれた情報は保持され続けます。
@RequestScopeを試してみましたが、これは実際にはうまくいきます。しかし、 "メイン"ビュー内のデータテーブルにアドレスを表示するときに問題が発生します。 insertAddressDialog.show()という名前のデータテーブルの一番下にボタンがあります。最初に開いて、私はデータを挿入することができますが、ビューがその時点で失われていると推測するため、挿入した新しいレコードがデータテーブルに表示されません。そして、2.データテーブル上のボタンはもはや生きているか、またはアクティブではないので、ユーザがレコードを最初に挿入した後にダイアログが開いていない。
これは簡単なことだと思われますが、私のアプリケーションには問題の原因となっている多くのネストされたビューがあります。このようなものをどう扱うかについての洞察は、本当に助けになるでしょう。
"メソッドコールをページに置くことができます: #{myBean.myMethod}他のコードはここにあります。 .. "それは私が考えなかった一つのアイデアだが、これは私にとってはうまくいかない。私のプログラムの仕組みについてのあなたの前提は正しいです。ビューがロードされる前にBeanをインスタンス化する方法や、提案したようにビューの最上部にBeanをインスタンス化する方法が必要です。 – medium
if(address == null){myDao.getAddresses();のようなデータテーブルのgetterにloginを置くことができます。返信アドレス} else {返信アドレス}しかし、私はセッターやゲッターに論理がないはずがないという仮説を否定していました。 – medium
さて、Beanは、ビューがロードされる前にインスタンス化されます。それが問題を起こしているのですが、Beanはインスタンス化(構築)され、直ちに@PostConstructが呼び出されます。 contactIdをBeanに渡した後で、データテーブルを初期化する必要があります。 @PostConstructでcontactIdを設定することもできます。特に、Beanをインスタンス化する前にすでに存在しているため、@ PostConstructでデータテーブルを初期化する必要があります。あなたの問題はただの流れです。 – Sean