我的测试应用包含两个h:inputText
和一个a4j:outputPanel
,它是重新渲染两个文本字段的触发器。两个文本字段在开头都是空的,第二个文本字段也是不可见的。单击面板后,将调用一个方法,该方法既设置输入值,也设置显示第二个文本字段的布尔值。这是代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fm30x="http://myfaces.inter-forum.de/fm30x/facelets"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<h:outputStylesheet name="stylesheet.css" library="css" />
</h:head>
<h:body>
<h:form id="mainForm">
<h:panelGrid>
<h:inputText id="text" value="#{testBean.testString}"/>
<h:inputText id="text2" value="#{testBean.trackingId}" rendered="#{testBean.showString}"/>
<a4j:outputPanel layout="block" styleClass="quote" onmousedown="begin();">
<h:outputText value="Thats a test" ></h:outputText>
</a4j:outputPanel>
</h:panelGrid>
<a4j:jsFunction name="begin" actionListener="#{testBean.start}" render="text text2" />
</h:form>
</h:body>
</html>
问题在于,当单击面板时,只有第一个文本字段被渲染,第二个文本字段仍然是不可见的,尽管我已经更新了bean内部的ajax方法中的布尔值。同样奇怪的是,当我总是为getter中的showString
值返回true时,第二个文本字段值会更新(这次我可以看到它,因为第二个文本字段将始终呈现)。总而言之,我可以说实际值的更新是正确的,但是render
的{{1}}属性未被ajax正确评估。我做错了什么?
答案 0 :(得分:3)
如果你有条件渲染的组件直接重新渲染它们不起作用。你必须将它们包装在某个东西中并在包装器上调用render。
<a4j:outputPanel id="wrapper">
<h:inputText id="text" value="#{testBean.testString}"/>
<h:inputText id="text2" value="#{testBean.trackingId}" rendered="#{testBean.showString}"/>
</a4j:outputPanel>
<a4j:outputPanel layout="block" styleClass="quote" onmousedown="begin();">
<h:outputText value="Thats a test" ></h:outputText>
</a4j:outputPanel>
<a4j:jsFunction name="begin" actionListener="#{testBean.start}" render="wrapper" />
请记住rendered="false"
并不意味着该组件是不可见的,这意味着它在组件树中不存在。