2012-05-20 29 views
1

作爲練習,我希望有一個菜單欄在用戶登錄之前處於禁用狀態。當他登錄時,我想調用觸發更新的操作。菜單欄是在master.xhtml模板文件如何更新呼叫模板中的菜單欄

<h:form > 
    <p:menubar id="masterMenuBar"> 
    <p:menuitem disabled="#{backing.disableMenu}" value="List users" /> 
    </p:menubar> 
</h:form> 

作爲登錄的一部分,我有一些代碼刷新

public void refreshForm() { 
    RequestContext context = RequestContext.getCurrentInstance(); 
    context.update("form1"); 
    context.update("masterMenuBar"); 
} 

我想我的運氣與調用上下文更新到我的定義masterMenuBar標籤形式但RequestContext顯然不包括我的呼叫模板形式(這聽起來足夠合理)。

是否有一些其他上下文我可以調用哪些將包括上下文更新到我的菜單欄?也許我走錯了路,有更好的方法來實現同樣的目標?

我注意到,即使調整瀏覽器大小也不足以再次調用我的backing.disableMenu bean。顯然我需要一些相當強大的東西來讓它第二次到達我的豆子。

回答

2

您需要傳遞絕對客戶端ID,而不是相對客戶端ID。如果您右鍵單擊並在瀏覽器中查看源代碼,則會看到masterMenuBar元素具有前綴形式的(自動生成的)ID。

你需要給這裏的菜單是坐在一個固定的ID

<h:form id="menuForm"> 
    <p:menubar id="masterMenuBar"> 
     ... 

形式,並通過絕對的客戶端ID來代替。

context.update("menuForm:masterMenuBar"); 

更新:對不起,它不應該與:在違背開始的<p:commandButton>update屬性。

+0

哎呀,我設法混淆你。有兩種形式,一種在主模板中,另一種在welcome.xhtml文件中。 welecome有一個id =「form1」。然而,如果我採取你的想法,也許我需要做的是context.update(「:masterMenuBar」)。我會嘗試的。 –

+0

如果它在表單內,那也不行。你需要傳遞它的絕對客戶端ID,它將是':form1:masterMenuBar'。檢查生成的HTML輸出以查看它。順便說一下,使用多少個模板/包含並不重要,畢竟只有一個'UIViewRoot'。 – BalusC

+0

感謝您的建議。我一直在嘗試我能想到的所有事情,但我無法讓它多次觸及我的斷點。我想也許它不會使用,所以我將id =向上移動一行到表單。這沒有任何區別。我嘗試組合使用:masterMenuBar,master:masterMenuBar和:master:masterMenuBar並且沒有任何作用。它仍然只碰到一次斷點。 –