2013-01-09 71 views
0

林我尝试了一下使用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对象。我如何使它在这种情况下工作?

+2

这将是更好的绑定到一个bean属性︰'rendered =“#{rand.someBoolean}”' – McDowell

+0

我完全同意,并已测试,它的工作原理,我只是试验绑定到一个组件,而不是到一个价值。 – B11

+0

okie毫无疑问问题很好解释。但我想知道你想要检查“我们如何使用托管bean呈现”或“UIOutput的功能”? – Freak

回答

1

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

我猜是因为每次渲染值为true或false时,都会呈现新视图,因为每次在新视图上将组件设置为呈现=“false”。

+1

它现在的作品,因为你的命令按钮触发一个完整的页面刷新,并在构建DOM时考虑到'render'的新值树 – kolossus

+0

在java ee教程中,我看到: 将组件的呈现属性设置为true后,此方法返回逻辑 结果为空。这会导致JavaServer Faces实现重新渲染页面,而不会创建页面的新视图,从而保留客户的输入。所以我的理解是它保持相同的对象,并简单地更新该设置。它是否正确? – B11

+0

是的,但可能不是你的想法。它不会创建一个新的视图,因为viewId仍然保留在用户会话中,但是**,整个DOM树(标记和全部)是使用来自服务器端的更新指令重建的 – kolossus

0

如果您正在使用按钮进行ajax调用,那么javascript无法在dom树中找到您的元素来呈现它,因为它不在第一处。

这里有一个类似的问题,它更好地解释了情况。

Render component with ajax in jsf

+0

嗨,我没有使用ajax调用,代码如上 – B11