【问题标题】:change rendered attribute from managed bean从托管 bean 更改呈现的属性
【发布时间】:2012-12-23 09:13:54
【问题描述】:

我正在用 JSF 做一些实验,场景如下:

我有一个会话范围的托管 bean

@ManagedBean(name = "rand")
@SessionScoped

我已经声明了以下内容(除其他外):

private UIOutput uiOutput;(plus getter and setter)

在我的 facelets 页面中,我有

<h:outputLabel for="userGuess"  binding="#{rand.uiOutput}" 
value="#{rand.listSize}" rendered="false"/>

页面上有一个按钮,以及按钮的操作方法以及我拥有的其他内容

this.uiOutput.setRendered(true);

但是好像不行,元素不会被渲染。

如果以渲染方式启动它并更改属性(将其设置为 true 或 false),它会起作用。 我怀疑这与以未渲染开始的元素未绑定到我在托管 bean 中的 uiOutput 对象这一事实有关。在这种情况下我怎样才能使它工作?

【问题讨论】:

  • 最好绑定一个bean属性:rendered="#{rand.someBoolean}"
  • 我完全同意,并且已经对其进行了测试并且它有效,我只是在尝试绑定到一个组件而不是一个值。
  • okie 毫无疑问,这个问题已经得到了很好的解释。但我想知道您想检查“我们如何使用托管 bean 进行渲染”或“UIOutput 的功能”?

标签: java jsf-2 managed-bean


【解决方案1】:

如果您使用按钮进行 ajax 调用,则 javascript 无法在 dom 树中找到您的元素来呈现它,因为它一开始就不存在。

这里有一个类似的问题可以更好地解释这种情况。

Render component with ajax in jsf

【讨论】:

    【解决方案2】:

    我改变了一件事,现在它正在工作,我改变了按下按钮时运行的方法的返回类型,它返回一个字符串值,导航到同一页面,它现在返回 null 而 JSF 没有生成一个新视图,而是呈现相同的视图,并且一切正常。

    我猜因为每次我将渲染值设置为 true 或 false 时都会渲染一个新视图,因为每次在新视图上将组件设置为 render="false" 都无关紧要。

    【讨论】:

    • 它现在可以工作了,因为您的命令按钮会触发整页刷新,并且在构建 DOM 树时会考虑 rendered 的新值
    • 在 java ee 教程中我看到:在将组件的渲染属性设置为 true 后,此方法返回逻辑结果 null。这会导致 JavaServer Faces 实现重新呈现页面而不创建页面的新视图,从而保留客户的输入。所以我的理解是它保持相同的对象,并简单地更新该设置。这是正确的吗?
    • 是的,但可能不是你想的那样。它不会创建新视图,因为 viewId 仍保留在用户的会话中,但是,使用来自服务器端的更新指令重建整个 DOM 树(标记和所有)
    • 是的,我了解所有涉及的 DOM 元素的重新创建,也许我对支持 bean 的生命周期有点混淆,这取决于它是会话或视图或请求范围 bean 谢谢
    猜你喜欢
    • 2011-04-07
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2012-06-30
    • 2016-06-22
    相关资源
    最近更新 更多