2012-05-20 26 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并且没有任何作用。它仍然只碰到一次断点。 –