【问题标题】:Ajax not renderingAjax 不渲染
【发布时间】:2014-04-27 19:10:49
【问题描述】:

我见过类似的问题,但没有找到答案...平台是 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”的许多变体。我想要最后一个例子,但试图展示一个简单的例子。

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

【问题讨论】:

  • 将属性 autoUpdate=true 添加到 p:growl 并确保 JSF 项目阶段设置为 web.xml 中的开发
  • 项目阶段是开发,咆哮才是真正起作用的。如果是另一个不是。即当我将团队事件更改为是时,团队大小标签和输入文本保持原始状态。如果它们在那里,它们就会保持不变,如果它们没有显示,它们就会保持这种状态。
  • 那只是为了显示 jsf 警告

标签: ajax jsf primefaces


【解决方案1】:

您的问题是您正在尝试更新依赖于呈现的项目。 它可能还不存在于 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>

然后在您的第一个布尔框中将其设置为更新“dataUpdate”。

或者你可以只做@form,因为它是一个很小的表单

【讨论】:

  • 解决了您的问题吗?
  • 是的,它帮助我通过对环境的更高层次的理解来思考。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2018-05-10
相关资源
最近更新 更多