Richfaces a4j:jsFunction呈现文本框但渲染验证失败

时间:2014-01-09 13:51:56

标签: ajax jsf richfaces

我的测试应用包含两个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正确评估。我做错了什么?

1 个答案:

答案 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"并不意味着该组件是不可见的,这意味着它在组件树中不存在。