Ajax没有呈现

时间:2014-03-20 18:01:48

标签: ajax jsf primefaces

我见过类似的问题,但是找到了答案...平台是JSF 2.2.6,Primefaces,Derby DB with Eclipse

我有两个实例,我正在切换一个项目以影响另一个项目,而ajax则提供更新。它们对我来说似乎是一样的,除了一个更新在表单内,另一个更新在外面。 “item”指的是使用布尔而不是布尔值的derby实体,这就是测试为== true的原因。这是XHTML部分:

    <p:growl id="msg"/>

    <h:form>
        <h:outputLabel value="Team event? " />
        <p:selectBooleanButton  value="#{events.item.teamEvent}" onLabel="Yes" offLabel="No">
            <p:ajax update="teamSize" listener="#{events.changeTeamEvent()}"/>
        </p:selectBooleanButton> 

        <h:outputLabel for="teamSize" id="teamSizeLabel"  rendered="#{events.item.teamEvent==true}" value="Team size: "/>
        <p:inputText id="teamSize" rendered="#{events.item.teamEvent==true}" value="#{events.item.teamSize}" 
                     validatorMessage="Team size must be between 2 and 4">
            <f:validateLongRange minimum="2" maximum="4" />
        </p:inputText>

        <br/>
        <h:outputLabel value="Allow signup? " />
        <p:selectBooleanButton value="#{events.item.allowSignup}" onLabel="Yes" offLabel="No">  
            <p:ajax update=":msg" listener="#{events.changeSignup()}"/>  
        </p:selectBooleanButton> 
    </h:form>    

支持bean是会话范围的,并且使用调试器证明了属性已更新,侦听器被调用。既不会改变属性。 在侦听器完成所有适当的集合之后,在渲染阶段也会调用实体文件,但在我的示例中只有第二个p:selectBooleanButton正确呈现。另一个更改按钮,但团队大小信息永远不会更改。当我刷新浏览器(最新的Chrome)时,它确实正确显示。我怀疑是我的渲染测试是错误的,但刷新应该适用于那种情况。我还尝试了更新属性“teamSize”,“:teamSize”,“teamSize teamSizeLabel”的许多变体。我想要最后一个例子,但试图展示一个简单的例子。

我认为这很简单,但我看不到它。

1 个答案:

答案 0 :(得分:2)

您的问题是您正在尝试更新依赖于呈现的项目。 它可能并不存在于DOM中。

您的渲染项目需要使用始终可更新的div进行包装。见下文

<h:panelGroup layout="block" id="dataUpdate">
       <h:outputLabel for="teamSize" id="teamSizeLabel"  rendered="#{events.item.teamEvent==true}" value="Team size: "/>
        <p:inputText id="teamSize" rendered="#{events.item.teamEvent==true}" value="#{events.item.teamSize}" validatorMessage="Team size must be between 2 and 4">
            <f:validateLongRange minimum="2" maximum="4" />
        </p:inputText>
</h:panelGroup>

然后在你的第一个布尔框中设置它以更新&#39; dataUpdate&#39;代替。

或者你可以做@form,因为它是一个小形式