【问题标题】:How to serialize multiple sortable items and subitems in jQuery如何在jQuery中序列化多个可排序项目和子项目
【发布时间】:2018-01-14 04:17:10
【问题描述】:

我正在使用来自 Sortable items and subitems in list on jQuery ui sortable 的解决方案,一切都应该是这样,我唯一不明白该怎么做就是序列化它们,以便我可以相应地修改数据库。

https://jsfiddle.net/5zwgx45q/

我根本不懂 jQuery 或 JavaScript,所以这对我来说简直就是一片丛林。

我正在使用以下代码在其他地方实现我想要的。

$(document).ready(function() {

    var data;

    // Sort the parents
    $(".sortProducts").sortable({
        containment: "document"
        , group: 'serialization'
        , items: "> div"
        , handle: ".move"
        , tolerance: "pointer"
        , cursor: "move"
        , opacity: 0.5
        , revert: 300
        , placeholder: "productPlaceholder"
        , start: function(e, ui) {
            ui.placeholder.height(ui.helper.outerHeight());
        }
        , stop: function(event, ui) {
            data = $(".sortProducts").sortable("toArray", {
                attribute: 'data-id'
            });
        }

    });

    $("#saveOrder").click(function() {
        $.ajax({
            url: 'process/sortMenu.php?action=products'
            , type: 'POST'
            , dataType: 'json'
            , data: {
                newOrder: JSON.stringify(data)
            },

            success: function(output) {
                alert('Menu order changed successfully!');
            },

            error: function(output) {
                alert($(output['responseText']).text());
            }
        });
    });
})

它序列化所有东西

data = $(".sortProducts").sortable("toArray", {attribute: 'data-id'});

我可以将更改应用到数据库。这里的不同之处在于我有两组可排序对象(父对象和子对象),所以我不知道如何让序列化同时适用于两者以及如何使用它。

孩子可以在父母之间移动,我需要能够在数据库中反映这一点。所以我需要知道哪个孩子属于哪个父母。

数据像论坛一样存储在数据库中。

ID | MenuID | Name | Position
-----------------------------
1  |   0    | Nme1 |    1
2  |   1    | Nme2 |    2
3  |   1    | Nme3 |    3
4  |   0    | Nme4 |    4

如果 MenuID 为 0,则它是父级。如果 MenuID 为 1,则它的父项是 ID = 1 的项目。

【问题讨论】:

标签: javascript jquery html jquery-ui jquery-ui-sortable


【解决方案1】:

你可以这样做:

function getSortableList(className){
  var sortables = $(className);
  var myArray = new Array();
  sortables.each(function() {
    myArray = myArray.concat($(this).sortable('toArray'));
  })
  // Show length of array
  alert(myArray.length);
}

Online demo (jsFiddle)

编辑

要根据您的数据库表转换项目,您可以使用以下代码:

function createRecordsFromSortableList() {
  var sortables = $(".menuItems");
  var records = [];

  sortables.each(function() {
    var currentParent = this;
    var myRecord = new record($(this).attr("id"), "0", $(this).closest(".menuGroup").find('h2').text());
    records.push(myRecord);
    $(this).find('.menuItem').each(function() {
      var myRecord = new record($(this).attr("id"), $(currentParent).attr("id"),$.trim($(this).text().replace(/[\t\n]+/g,' ')));
      records.push(myRecord);
    });

  });
  alert("Please see records in console.");
  console.log(records);
}

function record(id, menuId, name) {
  this.id = id;
  this.menuId = menuId;
  this.name = name;
}

Online demo (get records from sortable list)

【讨论】:

  • 这不是我所需要的。我需要能够在数据库中重新创建所有移动的项目,所以如果一个父母的孩子被移动到另一个父母,我将能够在数据库中做到这一点。
  • @ezw 我在答案中添加了编辑部分,用于将数据转换为数据库。请再看一遍。
  • 这非常接近,对于孩子来说,我需要以某种方式获得父母的 ID。 jsfiddle.net/k8x7om75
  • 我能弄明白。 (请参阅上面评论中的 jsfiddle)。我不确定这是否是遇到它的最有效方法)但我让 PHP 将该数组转换为可用数组。谢谢
猜你喜欢
  • 2014-04-28
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 2013-06-10
相关资源
最近更新 更多