我使用primefaces有以下前端代码
<p:panel binding="#{widgetBean.panel}"/>
<p:panel header="Widget 2" id="declaredPanel" style="height:300px; width:300px">
<p:droppable tolerance="touch" scope="widgetDrop" activeStyleClass="ui-state-highlight" >
<p:ajax listener="#{widgetBean.widgetDropped}" ></p:ajax>
</p:droppable>
</p:panel>
用于后端bean:
public Panel getPanel(){
Panel p = new Panel();
p.setHeader("test");
p.setId("programmaticPanel");
p.setStyle("height:300px; width:300px");
Droppable d = new Droppable();
d.setDatasource("availableWidgets");
d.setTolerance("touch");
d.setScope("widgetDrop");
d.setActiveStyleClass("ui-state-highlight");
FacesContext fc = FacesContext.getCurrentInstance();
ExpressionFactory ef = fc.getApplication().getExpressionFactory();
MethodExpression onDropExpr = ef.createMethodExpression(
fc.getELContext(), "#{widgetBean.widgetDropped}", null, new Class[] { DragDropEvent.class });
AjaxBehavior ajaxBehavior = new AjaxBehavior();
ajaxBehavior.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(onDropExpr));
d.addClientBehavior("drop", ajaxBehavior);
p.getChildren().add(d);
return p;
}
public void widgetDropped(DragDropEvent ddEvent) {
System.out.println("DROP EXECUTED ON SERVER");
}
最奇怪的事情发生了。如果我在UI中使用两种方式渲染Panel,我的ajax监听器永远不会被调用。如果我删除使用绑定的Panel,我的drop listener将被执行。最重要的是,我可以返回一个简单的简单面板,没有可丢弃的孩子,声明性面板仍然不会触发听众。然而事实恰恰相反。如果我删除声明性面板,则programmticaly绑定一个仍然永远不会触发监听器。真的我有两个问题: 1.)渲染程序化面板会破坏声明性面板上的drop listener事件 2.)在任何情况下,永远不会为程序化Panel调用drop listener。
我正在使用Primefaces 3.2并在Glassfish 3.1.1上运行我会在这一点上得到任何帮助。我研究了这个问题,并发现其他人抱怨程序绑定ajaxbehaviors的问题,特别是:Linky link这似乎解决了一些问题......对我而言并非如此。谢谢!