7

こんにちは私はPrimefacesでJSFを使用しています。進行状況(int)とステータス(String)をインジケーターとして、進行状況バーをユーザーに表示したいという長いタスクがあります。2つのパラメーターは、バックエンドBeanの2つのフィールドにマップされます。を使用する<p:poll>と、次のコードのように両方を更新できます。

<p:progressBar id="progress" ajax="false" value="#{backendBean.progress}" widgetVar="pbAjax"
  labelTemplate="{value}%: #{backendBean.statusMessage}" style="width:400px; font-size:12px"/>
<p:poll interval="1" id="poll" autoStart="false" update="progress" widgetVar="pbPoll"/>

ユーザーがボタンを押すと、pbPoll.start()。これは正常に機能します。今私は2つの質問があります:

(1)最初にプログレスバーを非表示にすることは可能ですか?cssにdisplay:noneを配置して、ボタンがクリックされたときに表示されるようにすることができます。ただし、投票の更新により、進行状況バーが再び非表示になります。多分レンダリングを使用します。もしそうなら、その方法を教えてください。

(2)progressBarにはajax関数自体があるので、ポーリングなしで使用できますか?上記のコードでajax=falseを設定していることに注意してください。彼らのウェブサイトには、「ダイナミックプログレスラベル」が追加されていると書かれています。試しましたが、どういうわけか、ラベル"{value}%"にはstatusMessageなしでしか表示されません。#{statusMessage}これは、両方がポーリングで取得されている間、別のフェッチが必要であり、したがって無視されるためであるかどうか疑問に思います。

感謝!

4

1 に答える 1

4
  1. はい、できます。実はとても簡単です。<p:progressBar/>のようなパネルでラップし、プログレスバーの属性をバッキングBeanのブール値に<h:panelGrid/>設定しますrendered

     <h:panelGrid id="progressBarPanel">
                    <p:progressBar id="progress" interval="100"  rendered="#{backendBean.progressBarRendered}" ajax="true" value="#{backendBean.progressMonitor}" widgetVar="pbAjax" labelTemplate="{value}%: #{backendBean.progressMonitor}" style="width:300px; font-size:12px"/>
     </h:panelGrid>
    

    次に、ボタン(または何か)を使用してブール値を切り替え、パネルを更新します

      <p:commandButton value="Test Progress Bar" action="#{addressUpdate.progressBarControl}" oncomplete="pbAjax.start();" update="progressBarPanel"/>
    

    注意する必要があるのは、プログレスバーの表示を切り替える同じボタンでonclickイベントを使用するのではなくoncomplete、プログレスバーを開始することです。これonclickは、リクエストがサーバーに到達する前に起動するためです。プログレスバーはDOMに存在しないため、start()未定義になります。

  2. あなたはその通りです。開発者コンソールを見ると、プログレスバーへのajaxの応答について次のように表示されます。

     "thePanel:progress_value":20
    

    そして、これは、更新中にプログレスバーが気にすること、つまりバーの値のバインドをほぼ要約しています。これがあなたにとってなくてはならないものであるならば、あなたが今持っているものに固執してください。

于 2013-01-27T06:51:37.063 に答える