3

'dynamic'属性が'true'に設定されているほとんどすべてのPFコンポーネントは、短い遅延(理解できる)の後にのみ表示され、ajaxの開始/停止イベントをトリガーしないことに気付きました。

これは私の(完全に機能している)Ajaxステータスコンポーネントであり、簡潔にするために実際のダイアログの内容は省略されています。

<p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();" onerror="errorDialog.show();"/> 

これは動的にロードされるダイアログです。バッキングBeanからデータを取得する必要があります。

<p:dialog modal="true" widgetVar="confDialog" position="center" id="confD" dynamic="true">
<p:panelGrid>
<p:row>
    <p:column>
        <h:outputText value="Date"></h:outputText>
    </p:column>
    <p:column>
        <h:outputText value="#{myBean.currentDate}">
            <f:convertDateTime locale="#{myBean.currentLanguage}" type="both" dateStyle="full" timeStyle="full" timeZone="#{myBean.currentTimeZone}"></f:convertDateTime>
        </h:outputText>
    </p:column>
</p:row>
</p:panelGrid>
<p:commandButton value="Close" type="button" onclick="confDialog.hide();">
</p:commandButton>
</p:dialog>

何かを実行し、動的にロードされた確認ダイアログを表示するコマンドボタン:

<p:commandButton value="Do it" type="submit" ajax="true" process="@form"
                action="#{bean.processForm}"
                oncomplete="if(!args.validationFailed){confDialog.show();}"
                update="confD @form"/>

コマンドボタンがデータをバッキングBeanに送信し、データを取得している間、Ajaxステータスダイアログが表示されます。その後、ajaxステータスダイアログが消え、1〜2秒の遅延があり、確認ダイアログが表示されます。

同じことが動的にロードされたタブ(PF tabViewコンポーネント内)でも発生します。

動的コンポーネントのロード中にajaxステータスダイアログが表示されないのはなぜですか?どうすれば見せられますか?

編集:

@partlovのおかげで、動的にロードされたダイアログにJQ ajax start / stopハンドラーを追加することで、PF関数をオーバーライドせずに解決策を見つけました。

jQuery(document).ready(function() {
 confDialog.getJQ().ajaxStart(function(){statusDialog.show()});
 confDialog.getJQ().ajaxStop(function(){statusDialog.hide()});
});
4

1 に答える 1

5

Primefacesのドキュメントに記載されている<p:ajaxStatus>ように、グローバルAJAXリクエストをインターセプトするだけであり、このリクエストはグローバルではありません。あなたが望むことをこれを行う簡単な方法はありません。ダイアログの読み込み時間が短いので、私は本当にこれのポイントがわかりません。私が思うに、唯一の解決策は、PrimefacesダイアログのJavaScriptメソッドをオーバーロードすることです。

PrimefacesはloadContents()、ダイアログコンテンツが読み込まれるときにメソッドを呼び出すため、このメソッドをオーバーライドできます。これは文書化されておらず、Primefacesの将来のバージョンで変更される可能性があるため、これを行うことはお勧めしません。

jQuery(document).ready(function() {
  var oldLoadContents = PrimeFaces.widget.Dialog.loadContents;
  PrimeFaces.widget.Dialog.loadContents = function() {
    statusDialog.show();
    oldLoadContents();
  }
});

これにより、動的読み込みに関するダイアログが表示されます。onShowの属性を使用p:dialogして、ダイアログを閉じることができます。

onShow="statusDialog.hide()"
于 2013-02-26T22:24:06.390 に答える