为什么添加以编程方式呈现面板会破坏声明的Panel的ajax行为?

时间:2012-03-14 17:18:37

标签: jsf primefaces

我使用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这似乎解决了一些问题......对我而言并非如此。谢谢!

0 个答案:

没有答案