2013-05-14 81 views
3

我最近將我的所有豆類從RequestScoped更改爲ViewScoped。突然,對話的延遲加載不起作用。我正在使用PrimeFaces JSF庫。PrimeFaces對話框延遲加載(dynamic =「true」)不起作用?

<html> 
<h:body> 
<f:view>  
    <h:form> 
     <p:commandButton id="addId" value="Add" title="Add" type="button" onclick="dlgMultiFileSelect.show();"/> 
     ... 
    </h:form>  
    <p:dialog header="Dialog" widgetVar="dlgMultiFileSelect" modal="true" resizable="true" dynamic="true"> 
     <ui:include src="/dialogs/media_browser.xhtml"/> 
    </p:dialog> 
</f:view> 
</h:body> 
</html> 

好像dynamic="true"因爲按鈕被點擊時media_browser.xhtml輔助Bean將立即被初始化,而不是不工作。

我做錯了什麼?

使用PrimeFaces 3.5.0。

+0

也許有PARTIAL_STATE_SAVING辦? http://stackoverflow.com/questions/5541813/jsf-viewscope-calls-constructor-on-every-ajax-request – Danijel 2013-05-15 13:12:15

回答

0

Facelet標籤ui:include將在循環的前面進行處理,因此它將被初始化。如果你想在點擊按鈕時更新對話框的內容,你需要在你的commandButton上使用update =「對話框的id」。您可以使用您的ui:include,以便頁面最初不加載。

3

已經發現了一些很簡單的解決方法:

讓我們報價BalusC對這個其他問題的答案: Skip executing <ui:include> when parent UI component is not rendered

<ui:include>運行爲在視圖生成時一個taghandler,而呈現的屬性在視圖渲染時間內評估。

關於他的第一個建議:

  1. 使用視圖生成時間標記像<c:if>圍繞<ui:include>部分。

所以先給你的bean添加一些新的方法。 (甚至可能是在某些應用中有用的作用域重用豆)

public boolean isAjaxRequest() { 
    boolean val = FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest(); 
    return val; 
} 

然後附上<ui:include>裏面以下<c:if>

<p:dialog id="yourDlg" header="Dialog" widgetVar="dlgMultiFileSelect" modal="true" resizable="true" dynamic="true"> 
    <c:if test="#{applicationBean.ajaxRequest}"> 
     <ui:include src="/dialogs/media_browser.xhtml"/> 
    </c:if> 
</p:dialog> 

因此,在頁面加載時間,請求不是阿賈克斯...和在基地頁面上的其他Ajax請求,對話框將不會被更新...... 但是,如果你觸發你的對話

<p:commandButton id="addId" value="Add" title="Add" type="button" 
    oncomplete="dlgMultiFileSelect.show();" update=":yourDlg"/> 

和更新它的內容,它會最終呈現!

請注意如下改變:號碼:對話ID號碼:更新的commandButton和號碼:的commandButton的onComplete