【问题标题】:JSF ajax commandbutton not updating primefaces picklistJSF ajax 命令按钮不更新primefaces 选择列表
【发布时间】:2012-01-18 01:56:31
【问题描述】:

这是代码:

<h:form id="articleForm" >
    <p:commandButton value="Select tags" ajax="true" >
        <f:ajax execute="@form" render="@form :articleForm:tags" />
    </p:commandButton>

    <p:pickList id="tags" value="#{articleController.dualListModelForTags}" var="tag" itemLabel="#{tag.tag}" itemValue="#{tag}" converter="distinctTagConverter">
        <f:facet name="sourceCaption">Distinct tags</f:facet>  
        <f:facet name="targetCaption">Connected tags</f:facet>
    </p:pickList>
</h:form>

单击命令按钮时,将调用并执行支持 bean 中的 getDualListModelForTags()。在 getDualListModelForTags() 中,我进行了一些修改,因此我希望更新选择列表。但是 picklist(id=tags) 不会再次呈现。只有当我刷新页面时,才会对选择列表进行修改。

【问题讨论】:

    标签: ajax jsf primefaces render


    【解决方案1】:

    PrimeFaces &lt;p:commandButton&gt; 组件不能与 &lt;f:ajax&gt; 一起使用。您需要改用按钮自己的面向 ajax 的属性。而不是&lt;f:ajax execute&gt;,您应该使用&lt;p:commandButton process&gt;。但是这已经默认为@form,所以你可以省略它。而不是&lt;f:ajax render&gt;,您应该使用&lt;p:commandButton update&gt;。不需要指定 @form 已经涵盖的客户端 ID,因此只需 @form 就足够了。 ajax="true" 属性也是不必要的,因为这已经是默认值了。

    所以应该这样做:

    <p:commandButton value="Select tags" update="@form" />
    

    与具体问题无关,您是在 getter 方法中完成业务工作。这是一个坏主意。改为在按钮的 action 方法中执行此操作。您似乎还使用会话范围 bean 来查看范围数据。这是一个坏主意。而是将 bean 放在视图范围内。

    【讨论】:

    • 优秀的答案。我想您知道我正在使用会话范围的 bean,因为 bean 变量在页面刷新期间仍然存在。但是为什么视图范围会更好呢?
    • 因为您正在处理视图范围的数据,而不是会话范围的数据。如果您将视图范围的数据视为会话范围的数据,那么当最终用户在同一浏览器会话的多个窗口/选项卡中打开相同的页面(视图)并在每次交互后在其之间切换时,最终用户可能会看到不一致。
    猜你喜欢
    • 2017-10-04
    • 2016-09-19
    • 2020-06-10
    • 2014-07-21
    • 1970-01-01
    • 2013-10-24
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多