如何在JSF Ajax事件期间更新两次

时间:2014-02-06 13:27:49

标签: ajax jsf primefaces autocomplete

给出以下代码:

            <p:column headerText="#{text.article}">
                <h:panelGroup>
                    <p:autoComplete id="relationArticle"
                                    value="#{relation.article}"
                                    completeMethod="#{articleRelationsModel.findArticles}"
                                    queryDelay="#{text.query_delay}"
                                    minQueryLength="#{text.artikkel_min_query_length}"
                                    var="article"
                                    itemLabel="#{article.articleNo} #{article.text1}"
                                     itemValue="#{article}"
                                    converter="#{articleConverter}"
                                    scrollHeight="150"
                                    forceSelection="true"
                                    styleClass="ui-autocomplete-big">
                        <p:ajax event="itemSelect" update="relationUnit" process="@this"/>
                    </p:autoComplete>
                    <p:message for="relationArticle"/>
                </h:panelGroup>
            </p:column>

            <p:column headerText="#{text.unit}" style="width: 80px;">
                <h:selectOneMenu id="relationUnit" value="#{relation.unit}" converter="#{articleUnitConverter}">
                    <f:selectItem itemLabel="&lt;&lt; #{text.search}" noSelectionOption="true" itemDisabled="#{relation.article != null}"/>
                    <f:selectItems value="#{articleRelationsModel.getUnits(relation)}" var="unit" itemLabel="#{unit.code}" itemValue="#{unit}"/>
                    <p:ajax event="change" process="@this" update="@this"/>
                </h:selectOneMenu>
                <p:message for="relationUnit"/>
            </p:column>

如何在用户选择“relationArticle”组件中的值后刷新“relationUnit”组件?

现在发生的事情是,在autcompete itemSelect事件触发后,“relationUnit”组件使用#{articleRelationsModel.getUnits(relation)}使用新内容进行更新。在此更新期间,将使用结果列表中的一个选项更新关系对象。但是,这不会在更新后的“relationUnit”组件中反映出来。但如果我在此之后手动执行另一次更新,则会被选中。

如何在这里实现想要的结果?

1 个答案:

答案 0 :(得分:0)

您可以使用p:remoteCommand,它通常用于从Javascript调用ManagedBean方法 虽然它可以满足上述目的,但您也可以使用它来更新其他组件。

您可以从p:remoteCommand的{​​{1}}属性中调用p:ajax

oncomplete

现在<p:autoComplete id="relationArticle" ...> <p:ajax event="itemSelect" update="relationUnit" onComplete="updateRelationUnit()" process="@this"/> </p:autoComplete> <p:remoteCommand name="updateRelationUnit" update="relationUnit" process="@this" /> 会更新p:ajax一次,然后再次拨打relationUnit,然后再转发p:remoteCommand。 我不知道你为什么要这种奇怪的行为,但上面的策略和代码服务器你的目的就好了。