【问题标题】:draggable rows in a p:dataTable by handle通过句柄在 p:dataTable 中拖动行
【发布时间】:2016-06-16 13:14:05
【问题描述】:

我有一个 DataTable,我在其中添加了对行的拖放支持 (draggableRows="true")。问题是,无论我在哪一行内单击,我都可以拖动它。

我想要的是仅通过句柄拖动行的可能性,例如,句柄可以是在行左侧带有图标的列字段(查看屏幕截图),因此如果用户单击在手柄外侧的一排上,没有阻力支撑;但如果他点击手柄,他就有可能拖动整行。

我该如何实现呢?

【问题讨论】:

  • 你不能捕捉到 ReorderEvent 然后决定根据点击的区域执行操作吗?这只是一个建议......
  • @Ko2r:有趣的想法!我会试试的:-)
  • 你可以看看这个
  • @Ko2r:我知道这一点,我的听众在坚持不懈和所有工作人员的帮助下工作得很好。我只是需要一个解决问题的方法。谢谢
  • 自 6.2 起仅供参考,PF 对此具有内置支持。有关详细信息,请参阅下面的答案。

标签: primefaces datatable drag-and-drop row draggable


【解决方案1】:

由于 Primefaces 6.2 p:datatable 有一个属性 rowDragSelector 专门用于此目的。请看下面的例子:

<p:dataTable value="#{myBean.entities}" id="myTablePreferredId" rowDragSelector=".draggableHandle" draggableRows="true">

    <p:ajax event="rowReorder" listener="#{myBean.onRowReorder}"/>

    <p:column>
        <h:outputText styleClass="fa fa-arrows-v draggableHandle" />
    </p:column>

    ...

</p:dataTable>

更多详情请参阅primefaces documentation

【讨论】:

    【解决方案2】:

    我的解决方案与@Kuketje 的解决方案相同。 这是源代码(兼容Primefaces 6.1)

    if (PrimeFaces.widget.DataTable){
    PrimeFaces.widget.DataTable = PrimeFaces.widget.DataTable.extend({
        makeRowsDraggable: function () {
            var $this = this,
                draggableHandle = '.dnd-handle'; //change to what ever selector as you like
    
            this.tbody.sortable({
                placeholder: 'ui-datatable-rowordering ui-state-active',
                cursor: 'move',
                handle: draggableHandle,
                appendTo: document.body,
                start: function (event, ui) {
                    ui.helper.css('z-index', ++PrimeFaces.zindex);
                },
                helper: function (event, ui) {
                    var cells = ui.children(),
                        helper = $('<div class="ui-datatable ui-widget"><table><tbody></tbody></table></div>'),
                        helperRow = ui.clone(),
                        helperCells = helperRow.children();
    
                    for (var i = 0; i < helperCells.length; i++) {
                        helperCells.eq(i).width(cells.eq(i).width());
                    }
    
                    helperRow.appendTo(helper.find('tbody'));
    
                    return helper;
                },
                update: function (event, ui) {
                    var fromIndex = ui.item.data('ri'),
                        toIndex = $this.paginator ? $this.paginator.getFirst() + ui.item.index() : ui.item.index();
    
                    $this.syncRowParity();
    
                    var options = {
                        source: $this.id,
                        process: $this.id,
                        params: [
                            {name: $this.id + '_rowreorder', value: true},
                            {name: $this.id + '_fromIndex', value: fromIndex},
                            {name: $this.id + '_toIndex', value: toIndex},
                            {name: this.id + '_skipChildren', value: true}
                        ]
                    }
    
                    if ($this.hasBehavior('rowReorder')) {
                        $this.cfg.behaviors['rowReorder'].call($this, options);
                    }
                    else {
                        PrimeFaces.ajax.Request.handle(options);
                    }
                },
                change: function (event, ui) {
                    if ($this.cfg.scrollable) {
                        PrimeFaces.scrollInView($this.scrollBody, ui.placeholder);
                    }
                }
            });
    
        }
    });
    

    }

    Vít Suchánek 的解决方案并没有真正奏效。它仅在页面准备就绪时检测拖放句柄。在第一次拖放交互后,它不再起作用了。

    【讨论】:

      【解决方案3】:

      另一种可能性是在 UI 可排序初始化后覆盖 Primefaces 的处理程序设置:

          <script type="text/javascript">
              $(document).ready(function() {
                  var sortableRows = $(".tableWithDraggableRows > tbody");
                  if (sortableRows) {
                      sortableRows.sortable("option", "handle", ".ui-icon-arrow-4");
                  }
              });
          </script>
      

      http://api.jqueryui.com/sortable/#option-handle

      【讨论】:

        【解决方案4】:

        source 始终与您同在。在那里你可以看到the makeRowsDraggable function on line 2727 in datatable.js

        makeRowsDraggable: function() {
            var $this = this;
        
            this.tbody.sortable({
                placeholder: 'ui-datatable-rowordering ui-state-active',
                cursor: 'move',
                handle: 'td,span:not(.ui-c)',
                appendTo: document.body,
                start: function(event, ui) {
                    ui.helper.css('z-index', ++PrimeFaces.zindex);
                }, 
            ...
        }
        

        引用句柄 ('td, span:not(.ui-c)')。

        通过重写此函数并使句柄指向明确引用您的句柄的选择器,您可以“修复”它。

        您甚至可以通过不将显式字符串分配给句柄来使其通用,而是在例如您在放置“字符串”的数据表上定义的自定义传递属性。

        我是否已经提到the source 一直与你同在?有更多问题时要记住的好事情

        【讨论】:

        • 这是积极的!我在自定义 JS 文件中覆盖了 makeRowsDraggable() 并将其导入到我的主模板中,它就像一个魅力。谢谢@Kukeltje
        • 很高兴听到。请记住,源泉始终与您同在。在其他情况下也是如此
        • 自 6.2 起仅供参考,PF 对此具有内置支持。有关详细信息,请参阅下面的答案。
        猜你喜欢
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-05
        • 1970-01-01
        相关资源
        最近更新 更多