JSF的ajax命令按钮不能更新PrimeFaces选择列表

3
这是代码:

这是代码:

<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。但是picklist(id=tags)没有被重新渲染。只有当我刷新页面时,才会将修改应用于picklist。

1个回答

13

PrimeFaces的<p:commandButton>组件无法与<f:ajax>一起使用。相反,您需要使用该按钮自己的ajax-targeted属性。您应该使用<p:commandButton process>而不是<f:ajax execute>。但是,这已经默认为@form,因此您可以省略它。您应该使用<p:commandButton update>而不是<f:ajax render>。指定已由@form覆盖的客户端ID是不必要的,因此只需使用@form即可。另外,ajax="true"属性是不必要的,因为默认值已经是这样。

所以只需要这样做:

<p:commandButton value="Select tags" update="@form" />
与具体问题无关,您正在一个getter方法中执行业务逻辑,这是不好的做法。请在按钮的action方法中执行它。此外,您似乎在使用会话作用域的bean来存储视图作用域数据,这也是不好的做法。请将bean放在视图作用域中。

非常好的答案。我猜你知道我正在使用会话作用域的bean,因为bean变量在页面刷新期间保持不变。但是为什么视图作用域会更好呢? - BigJ
1
因为你正在处理视图范围的数据,而不是会话范围的数据。如果您将视图范围的数据视为会话范围的数据,则当最终用户在同一浏览器会话中的多个窗口/选项卡中打开并在每次交互后切换时,最终用户可能会看到不一致性。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接