【问题标题】:How do I update a menu bar in a calling template如何更新调用模板中的菜单栏
【发布时间】:2012-05-20 05:52:06
【问题描述】:

作为一个练习,我希望有一个菜单栏在用户登录之前禁用。当他登录时,我想调用一些会触发更新的东西。菜单栏在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。显然我需要一些相当坚固的东西才能让它再次到达我的豆子。

【问题讨论】:

    标签: jsf primefaces


    【解决方案1】:

    您需要传递绝对客户端 ID,而不是相对客户端 ID。如果您右键单击并在浏览器中查看源代码,您将看到 masterMenuBar 元素具有其表单的(自动生成的)ID 作为前缀。

    你需要给表单所在的菜单一个固定的ID

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

    并改为传递绝对客户端 ID。

    context.update("menuForm:masterMenuBar");
    

    更新:抱歉,它不应该以: 开头,这与&lt;p:commandButton&gt;update 属性相反。

    【讨论】:

    • 糟糕,我把你弄糊涂了。有两种形式,一种在主模板中,另一种在welcome.xhtml 文件中。欢迎的确实有一个 id="form1"。但是,如果我接受您的想法,也许我需要做的是 context.update(":masterMenuBar")。我会试试的。
    • 如果它在表单中也不会起作用。您需要传递其绝对客户端 ID,即 :form1:masterMenuBar。检查生成的 HTML 输出以查看它。顺便说一句,你使用多少模板/包含并不重要,毕竟只有一个UIViewRoot
    • 感谢您的建议。我一直在尝试我能想到的一切,但我不能让它多次达到我的断点。我想它可能不喜欢使用 ,所以我将 id= 向上移动了一行。那没有任何区别。我尝试了 :masterMenuBar、master:masterMenuBar 和 :master:masterMenuBar 的组合,但没有任何效果。它仍然只命中一次断点。
    • 也许真正的问题是我无法从另一个表单中更新一个表单。我的提交按钮在表单 id=form1 中,在welcome.xhtml 中。我的菜单命令位于 master.xhtml 中的另一种形式中。如果这是一个问题,解决它的正确方法是什么?
    • 抱歉,RequestContext#update() 不应采用前缀为 : 的 ID,这与例如 &lt;p:commandButton&gt;update 属性相反。它应该采用不带前缀的绝对 ID。我更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多