JSF ajax命令按钮未更新primefaces选取列表

JSF ajax命令按钮未更新primefaces选取列表,ajax,jsf,primefaces,render,Ajax,Jsf,Primefaces,Render,代码如下: <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="#{articleC

代码如下:

<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>

不同的标签
连接标签
单击commandbutton时,将调用并执行支持bean中的getDualListModelForTags()。在getDualListModelForTags()中,我做了一些修改,以便更新选取列表。但不会再次呈现拾取列表(id=标记)。只有在刷新页面时,才会对拾取列表进行修改。

PrimeFaces
组件不能与
一起工作。您需要使用按钮自己的ajax目标属性。您应该使用
而不是
。但这已经默认为
@form
,因此您可以忽略它。您应该使用
而不是
。指定
@form
中已经包含的客户端ID是不必要的,因此只需
@form
就足够了。另外,
ajax=“true”
属性是不必要的,因为这已经是默认值了

所以这应该可以:

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



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

回答得很好。我想您知道我使用的是会话范围的bean,因为bean变量在页面刷新期间仍然存在。但是为什么视图范围更好呢?因为您处理的是视图范围的数据,而不是会话范围的数据。如果将视图范围内的数据视为会话范围内的数据,则当最终用户在同一浏览器会话的多个窗口/选项卡中打开同一页面(视图)并在每次交互后在其之间切换时,endser可能会看到不重要的内容。