2013-02-26 27 views
3

我注意到,有「動態」屬性設置爲「真」在短暫的延遲之後纔會顯示出來(這是可以理解的),也不會觸發幾乎所有的PF分量ajaxstatus ajax開始/停止事件。如何顯示動態Primefaces組件

這是我的(正常使用)的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狀態對話框消失,延遲1-2秒,並顯示確認對話框。與動態加載凸片

同樣的情況(在PF TabView的分量)。

爲什麼動態組件負載時不顯示我的AJAX狀態對話框?我如何顯示它?

編輯:

由於@partlov我想出了一個解決方案,而重寫PF功能,通過添加JQ AJAX啓動/停止處理程序,以動態加載的對話框:

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

你在哪裏放了jQuery開始/停止代碼? – Seitaridis 2013-05-23 13:30:43

+0

頁面中的任何位置。然而,也http://stackoverflow.com/questions/16173811/cannot-show-dialog-in-primefaces-requestcontext-execute-call看到如需要加強狀態對話框一切正常 – rootkit 2013-05-24 14:47:50

回答

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(); 
    } 
}); 

這將顯示您的動態加載對話框。您可以使用onShowp:dialog屬性關閉對話框:

onShow="statusDialog.hide()" 
+0

謝謝你!我不知道對話加載不是全局的Ajax調用。我不認爲它在文檔中的任何地方提到過。 – rootkit 2013-02-26 23:14:25

+0

@rootkit你對對話加載意味着什麼,顯示加載動畫/消息或對話內容加載的對話框? – 2013-02-27 01:06:59

+0

@LuiggiMendoza,我有兩個對話框:一個是ajax狀態對話框(只顯示'正在加載...'),另一個彈出模式對話框向用戶顯示動作確認。確認對話框的屬性dynamic = true。我的問題是/確認對話框加載時,沒有顯示ajax狀態。這可能需要幾秒鐘或更長時間,用戶可能會對爲什麼沒有發生任何事情感到困惑。 – rootkit 2013-02-27 14:31:39