単純なh:outputTextコンポーネントについて考えてみます。
<h:outputText value="#{myBean.myValue}"/>
ページがレンダリングされた後にその値を遅延ロードし、これが行われている間、値の代わりにカスタムの「ajaxloading」アイコンを表示するにはどうすればよいですか?
私はプロジェクトでPrimeFaces3.5を使用しているので、PF固有の実装は歓迎されます。
単純なh:outputTextコンポーネントについて考えてみます。
<h:outputText value="#{myBean.myValue}"/>
ページがレンダリングされた後にその値を遅延ロードし、これが行われている間、値の代わりにカスタムの「ajaxloading」アイコンを表示するにはどうすればよいですか?
私はプロジェクトでPrimeFaces3.5を使用しているので、PF固有の実装は歓迎されます。
remoteCommand
ページの読み込み後に呼び出して(autoRun
属性をtrueに設定することで実行されます)、これを実行して、を更新することをお勧めしますoutputText
。
private String myValue;
// getter and setter
public void initMyValue() {
// init myValue
}
ページにはajaxStatus
、読み込み中の画像を表示するためのコンポーネントと、が必要outputText
です。p:remoteCommand
また、コンポーネントが必要です。
<p:ajaxStatus style="width:16px;height:16px;" id="ajaxStatusPanel">
<f:facet name="start">
<h:graphicImage value="ajaxloading.gif" />
</f:facet>
<f:facet name="complete">
<h:outputText value="" />
</f:facet>
</p:ajaxStatus>
<h:outputText id="myText" value="#{myBean.myValue}"/>
<p:remoteCommand autoRun="true" actionListener="#{myBean.initMyValue}" update="myText"/>
編集:outputText
いくつかの長時間実行計算が含まれているため、の遅延読み込み値が必要だと思いましたが、バッキングBeanのoutputText
最初のaddboolean
プロパティのレンダリングを完全に延期し、このプロパティをメソッドtrue
の最後に設定initMyValue
する場合:
private boolean loaded;
// getter and setter
public void initMyValue() {
// init myValue
loaded = true;
}
ページ上で次のように再編成します。
<h:panelGroup id="myPanel" layout="block">
<h:graphicImage value="ajaxloading.gif" rendered="#{!myBean.loaded}"/>
<h:outputText value="#{myBean.myValue}" rendered="#{myBean.loaded}"/>
</h:panelGroup>
<p:remoteCommand autoRun="true" actionListener="#{myBean.initMyValue}" update="myPanel"/>
これが私がそれを実装することになった方法です:
<h:panelGroup id="loginLocation">
<p:graphicImage library="assets" name="small-kit-loader.gif" width="16" height="16" rendered="#{empty mybean.lastLoginLocation}"></p:graphicImage>
<h:outputText value="#{myBean.lastLoginLocation}" rendered="#{!empty myBean.lastLoginLocation}"/>
</h:panelGroup>
<p:remoteCommand global="false" actionListener="#{actionBean.getUserLoginLocation(myBean.selectedUser)}" name="refreshLoginLocation" id="rc1" autoRun="true" update="loginLocation" process="@this"></p:remoteCommand>
個人的には、この実装に完全に満足しているわけではありません。
このコードを改善する方法に関する推奨事項は大歓迎です!:)
BlockUIを使用して、コンポーネントのロード中にコンポーネントを条件付きでブロックできます。
preRenderComponent
でイベントを定義する<h:outputText/>
<h:outputText id="myText">
<f:event name="preRenderComponent" id="started"/>
</h:outputText>
<p:blockUI/>
イベントのIDをトリガーとしてaを定義します
<p:blockUI block="myText" trigger="started" />
blockuiをカスタマイズして、画像などを表示できます。
注意点:そのコンポーネントのゲッターで重い物を持ち上げているので、これが必要だと思います。そのページのライフサイクルでゲッターが数回呼び出されることを知っておいてください。したがって、操作に時間がかかるという事実を隠しても、事実は変わりません。より良い設計は、「ロード」スロバーの演劇ではなく、耐久性のあるスコープでそのコンポーネントの値をプリロードしてキャッシュすることです。