私はfaceletテンプレートを使用していますが、私はui:defineとJSFライフサイクルの問題に遭遇していると思います。JSF2.0パーサーレンダリングwith ui:define
<h:commandLink value="Click Me">
<f:ajax update="#{myBean.listener}" render="contentpanel"/>
</h:commandLink>
のtemplate.xhtmlもUIが含まれています:文を挿入します。
<ui:insert name="content">
<h:outputLabel value="content placeholder"/>
</ui:insert>
今、私がコンテンツを持っている私のtemplate.xhtmlは、このようなリンクはしている簡略化され、ヘッダに固定されたメニューが含まれています.xhtmlは次のようになります。
<ui:composition template="template.xhtml">
<ui:define name="content">
<h:panelGroup id="contentpanel"/>
</ui:define>
</ui:composition>
コマンドリンク 'Click Me'をクリックすると、私はリスナーに電話しています。このリスナーは、クリックしたリンクに基づいてコンテンツを動的にロードするためのバッキングビーンのリファレンスを設定します。
このレンダリングはコマンドリンクを初めて押すときには行われません。基本的には、最初にレンダリングを行い、リスナを別の方法で呼び出すのと同じように見えます。だから私が最初にクリックすると何も起こりそうにない。もう一度クリックすると、最初のクリックに対して設定されたコンテンツが表示されます。 3回目をクリックすると、2回目のクリックの内容が表示されます。
私は、ui:defineビューはJSFライフサイクルの 'Restore View'フェーズで既に再構築されているからだと思います。どのようにこれを克服するための任意のアイデア?
UPDATE
私の仮定が間違っていたように思えます。これの原因は何か違うようです。 #{myBean.listener}
には@SessionScoped @ManagedProperty
があり、これはCommandLinkをクリックした後に更新されます。 contentpanelは実際に#{myBean.data}
(@RequestScoped
)でデータをロードします。この#{myBean.data}
はデータを正しくリロードしませんでした。私はgetData()
メソッドを直接@SessionScoped
beanに渡して解決しました。
少し混乱するかもしれません。しかし、私の結論:私の仮定が間違っていたようにそれは、がにfaceletのテンプレート(ui:define/ui:insert
)を介してロードされたコンポーネントをレンダリングする部分に作業を行う
あなた自身の質問に答えるなら、おそらくあなたの答えを回答ボックスこの問題が解決されたことを他の人に知らせるために受け入れます。それを解決したコードを追加すると、同じ問題を抱えている他の人に役立つかもしれません。 – Sean