Ajax监听器使用primefaces执行了两次

时间:2013-10-04 09:11:05

标签: jsf primefaces

我想为p:droppable组件提供两个ajax侦听器。

虽然有效但我的听众每次都被召唤两次。

<ui:repeat id="orderGroups" value="#{omsOrderActionBean.order.orderGroups}" var="group">
  <p:panel > 
   <p:fieldset id="selectedLineItems" style="margin-top:20px">
    <p:dataTable>
         ...
    </p:dataTable>
   </p:fieldset>
 </p:panel>
 <p:droppable for=":frmItem:tabViewSections:orderGroups:selectedLineItems"
  tolerance="touch" activeStyleClass="ui-state-highlight" datasource=":frmItem:tabViewSections:availableItems" onDrop="handleDrop">
    <p:ajax listener="#{omsOrderActionBean.setSelectedOrderGroup(group)}" immediate="true" />
    <p:ajax listener="#{omsOrderActionBean.onArticleDrop}" update=":frmItem:tabViewSections:outpOrderGroups :frmItem:tabViewSections:availableItems" />
 </p:droppable>
</ui:repeat>

你知道如何避免这种行为吗?或者如何将参数传递给和ajax事件?

2 个答案:

答案 0 :(得分:0)

我强烈建议你不要为同一事件安排两个ajax听众。这会增加客户端/服务器流量,执行多个使您的系统变慢的ajax请求。相反,只执行其中一个并在那里执行整个逻辑。

<p:ajax listener="#{omsOrderActionBean.onDrop}" 
    update=":frmItem:tabViewSections:outpOrderGroups :frmItem:tabViewSections:availableItems" />

为了获取被删除的对象,您应该遵循showcase中指定的签名:

public void onDrop(DragDropEvent event) {  
    Group group = (Group) event.getData();  
}  

答案 1 :(得分:0)

我找到了解决自己问题的方法。我只使用一个ajax监听器。在这个监听器中,我得到包含我的组位置的dropId。然后我简单地将其转换为整数并从我的订单列表中获取它:

// DropId is of the form: orderGroups:0:selectedLineItems
String[] dropSplit = ddEvent.getDropId().split(":");
// Get the second part to retrieve the correct orderGroup:
int orderGroupPosition = Integer.parseInt(dropSplit[2]);
orderGroups.get(orderGroupPosition);