2012-03-02 35 views
0

我是新来的primefaces。我正在从primefaces2.2迁移到primefaces3.1.1,因为我必须在应用程序中包含primefaces3.1.1的新功能。<p:ajax>听众永远不会叫

应用程序中有一个dragndrop功能。它与primefaces2.2工作正常,但是当我根据primefaces3.1.1的规范进行更改时。 dragndrop功能不起作用。

其实情景就像是

我有一个数据表,其中我是从数据库中获取价值和显示。有一种可以治疗的疾病。

数据表行将被拖放到treetable区域。虽然这样做我已经写了监听器,但它永远不会被调用。

我在这里提供的代码

workflow.xhtml

<p:fieldset id="workflowtabs" legend="Drop here" rendered="#{workflowStep2Bean.childCount gt 0}"> 
    <p:outputPanel id="dropArea"> 
<p:treeTable id="testtable" value="#{workflowStep2Bean.root}" var="selected" rendered="#{not empty workflowStep2Bean.root}" > 
                  <p:column rendered="#{selected.type eq 'Folder'}"> 
                   <p:commandButton icon="ui-icon ui-icon-folder-open" disabled="true"/> 
                  </p:column>                 
                  <p:column rendered="#{selected.type eq 'Folder'}" > 
                   <h:inputText value="#{selected.name}" />                   
                  </p:column>                 
                 </p:treeTable> 
                </p:outputPanel>  
               </p:fieldset> 
<p:fieldset id="testfields" legend="#{msg.tests}" rendered="#{workflowStep2Bean.childCount gt 0}"> 
                <p:dataTable id="teststable" value="#{workflowStep2Bean.tests}" var="testList" > 
                 <p:column style="height: 20px" headerText="Drag"> 
                  <h:outputText id="dragIcon" styleClass="ui-icon ui-icon-arrow-4"/> 
                  <p:draggable for="dragIcon" revert="true" scope="#{dragIcon.position}" stack=".ui-icon ui-icon-arrow-4"/>                 
                 </p:column>               
                 <p:column headerText="Name"> 
                  <h:outputText value="#{testList.name}"></h:outputText> 
                 </p:column>                    
                </p:dataTable>                                     
               </p:fieldset> 
<p:droppable for="workflowtabs" tolerance="touch" activeStyleClass="ui-state-highlight" datasource="teststable" onDrop="handleDrop"> 
              <p:ajax listener="#{workflowStep2Bean.onTestDrop}" update="dropArea teststable" /> 
            </p:droppable> 

,这里是我的workflowStep2Bean.java

public void onTestDrop(DragDropEvent ddEvent) { 
    if (getTabs().size() > 0) { 
     TreeNode tab = getTabs().get(getTabs().size() - 1); 
     Test t = (Test) ddEvent.getData(); 
     tests.remove(t); 
     ((Tab) tab.getData()).getTests().add(t); 
     TreeNode tabC = new DefaultTreeNode(t, tab); 
    } 
} 

请告诉我,我做错了。预先感谢

我使用primefaces 3.1.1,2.1.3 Mojorra,Glassfish的3.1.1,JSF2.0

+0

我不确定是否这是拖放功能不起作用的原因,但是在PrimeFaces的第3版中,您现在必须指定“p:dataTable”的'rowKey'属性来正确更新行选择。这个'rowKey'表示唯一标识'value'集合中bean的bean属性。不幸的是,展示会忽略了这一点,希望Primefaces团队能尽快更新。您可以在Primefaces手册中获得更多信息。 – 2012-03-02 12:57:52

+0

感谢您的评论。请给我发送primefaces手册的链接以及链接,我可以看到指定数据表示例中的rowkey – Sharath 2012-03-05 07:42:47

+0

您可以在此处下载... http://www.primefaces.org/documentation.html – 2012-03-05 12:23:00

回答

0

我有一个类似的问题,我通过以下方式解决:

有一个<p:droppable>与一个onDrop=""参数和一个<p:ajax ... />命令imbeded没有工作。

https://stackoverflow.com/a/19223442/1431979的解释,我先删除了onDrop="handleDrop()"说法在我

<p:droppable for="PD" accept=".#{item.classeInverse}" onDrop="handelDrop()" /> 

和页面加载后连接三个如下因素事件侦听器的用户界面,可放开类替代它:

jQuery(window).load(function(){ 

    $(".ui-droppable").on("dragover", function() { 
     event.preventDefault(); 
     event.stopPropagation(); 
     $(this).addClass('dragging'); 
    }); 

    $(".ui-droppable").on("dragleave", function() { 
     event.preventDefault(); 
     event.stopPropagation(); 
     $(this).removeClass('dragging'); 
    }); 

    $(".ui-droppable").on("drop", function(event) { 
     event.preventDefault(); 
     event.stopPropagation(); 
     console.log("Dropped!"); 
    }); 

}); 

然后,你应该能够修改上面的on("drop"...函数使用<p:remoteCommand>命令进行ajax调用。

希望这可以帮助。