首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用来自db的存储结构还原jquery ui可排序列表

如何使用来自db的存储结构还原jquery ui可排序列表
EN

Stack Overflow用户
提问于 2019-01-15 06:31:51
回答 1查看 253关注 0票数 1

我尝试在我的db中存储一个列表结构(基于这个问题1:How to serialize a nested sortable ul list),之后我需要一种方法来恢复/重置列表,如果页面是刷新的,或者根据db的数据加载新的。

有一个内置的方式来做这件事,或者我该如何做?

在我的列表中,我使用嵌套元素来支持创建灵活嵌套结构的方法。

这就是我已经拥有的

名单

代码语言:javascript
复制
<ul id="mysite" class="mysite editor-ul ui-sortable-handle ui-sortable">
  <li class="draggable editor-li editor-li-head ui-sortable-handle">Headline</li>
  <li class="draggable editor-li ui-sortable-handle" id="p-1">
    Item1
    <ul class="mysite editor-ul ui-sortable"></ul>
  </li>
  <li class="draggable editor-li ui-sortable-handle" id="p-5">
    Item 2
    <ul class="mysite editor-ul ui-sortable">
      <li class="draggable editor-li ui-sortable-handle" id="p-7" style="">
        Item 3
        <ul class="mysite editor-ul ui-sortable"></ul>
      </li>
      <li class="draggable editor-li ui-sortable-handle" id="p-6" style="">
        Item 4
        <ul class="mysite editor-ul ui-sortable"></ul>
      </li>
    </ul>
  </li>
</ul>

“联合来文法”

代码语言:javascript
复制
$(function() {
  //$(".mysite").sortable({

  $(".mysite").sortable({
    connectWith: ".mysite",
    placeholder: "placeholder",
    update: function(event, ui) {
      var struct = [];
      var i = 0;

      $(".mysite").each(function(ind, el) {
        struct[ind] = {
          index: i,
          class: $(el).attr("class"),
          count: $(el).children().length,
          parent: $(el).parent().is("li") ? $(el).parent().attr("id") : "",
          parentIndex: $(el).parent().is("li") ? $(el).parent().index() : "",
          array: $(el).sortable("toArray"),
          serial: $(el).sortable("serialize")
        };
        i++;
      });
      console.log("Structure", struct);


      $.ajax({
        data: {
          "'.$this->security->get_csrf_token_name().'": "'.$this->security->get_csrf_hash().'",
          "job": "updateSiteStruc",
          "data": struct
        },
        type: "POST",
        url: "'.base_url().'"
      });


      var iArr = [];
      var iSer = [];
      $(".mysite:eq(0) li").each(function(ind, el) {

        if ($(el).attr("id") != undefined) {
          var label = $(el).attr("id");
        } else {
          return true;
        }

        iArr.push(label);
        var pre = label.slice(0, label.indexOf("-")) + "[]=";
        iSer.push(pre + label.slice(label.indexOf("-") + 1));
        if ($(el).children().eq(0).is("ul")) {
          $(el).find("li").each(function() {
            iArr.push($(this).attr("id"));
            iSer.push(pre + $(this).attr("id").slice(label.indexOf("-") + 1));
          });
        }
      });
      console.log("Items Array", iArr);
      console.log("Items Serial", iSer.join("&"));
    }
  }).disableSelection();

});

基于此,我存储结构。

  • ajax发送
  • json_encode($post['data'])保存在db中

所以现在我在我的数据库里

“[{”数组“:"”、"p-1“、"p-5”、“类”:"mysite编辑器-ul ui-sortable-handle ui-sortable“、"count":"3”、"index":“0”、“父”:"“、”串行“:"p[]=1&p[]=5”、"parentIndex":“}”、{“类”:"mysite编辑器-ul ui-可排序“、”计数“:”0“、"0",“索引”:"1“、”父“:"p-1”、“串行”:"“、"parentIndex":"1"}、{”数组“:"p-7”、"p-6“、"class":"mysite编辑器-ul ui-sortable”、“计数”:"2“、”索引“:"2”、“父”:"p-5“、”串行“:"p[]=7&p[]=6","parentIndex":"2"},{"class":"mysite编辑器-ul ui-sortable","count":"0","index":"3",“父”:"p-7","serial":"","parentIndex":"0"},{"class":"mysite编辑器-ul ui-sortable","count":"0","index":"4",“父”:"p-6",“串行”:"","parentIndex":“1”}“

以上字符串的格式化版本:

代码语言:javascript
复制
"[{
  "array": ["", "p-1", "p-5"],
  "class": "mysite editor-ul ui-sortable-handle ui-sortable",
  "count": "3",
  "index": "0",
  "parent": "",
  "serial": "p[]=1&p[]=5",
  "parentIndex": ""
}, {
  "class": "mysite editor-ul ui-sortable",
  "count": "0",
  "index": "1",
  "parent": "p-1",
  "serial": "",
  "parentIndex": "1"
}, {
  "array": ["p-7", "p-6"],
  "class": "mysite editor-ul ui-sortable",
  "count": "2",
  "index": "2",
  "parent": "p-5",
  "serial": "p[]=7&p[]=6",
  "parentIndex": "2"
}, {
  "class": "mysite editor-ul ui-sortable",
  "count": "0",
  "index": "3",
  "parent": "p-7",
  "serial": "",
  "parentIndex": "0"
}, {
  "class": "mysite editor-ul ui-sortable",
  "count": "0",
  "index": "4",
  "parent": "p-6",
  "serial": "",
  "parentIndex": "1"
}]"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-15 10:12:45

如果您想要构造一个项目列表,这些项可以作为字符串存储在DB中,然后在HTML中构建为<ul>,那么我建议使用更加复杂的结构,以便在数据中有更深层次的关系。

代码语言:javascript
复制
$(function() {

  var saveData;

  function makeObj(list) {
    var d = [];
    d.push({
      id: list.attr("id"),
      class: list.attr("class"),
      items: []
    });
    list.children("li").each(function(ind, el) {
      var item = {
        attr: {
          index: ind,
          id: $(el).attr('id') || "list-item-" + ind,
          class: $(el).attr('class'),
          style: $(el).attr('style')
        },
        label: el.firstChild.data.trim(),
        children: $("ul", el).length ? true : false,
        childObj: false
      };
      d[0].items.push(item);
    });
    return d;
  }

  function buildList(d, t) {
    console.log(d);
    $.each(d, function(key, item) {
      $("<li>", item.attr).html(item.label).appendTo(t);
    });
  }

  function makeSort(obj, cnwt) {
    obj.sortable({
      connectWith: cnwt,
      placeholder: "placeholder"
    });
  }

  function stringify(d) {
    return JSON.stringify(d);
  }

  function parse(s) {
    return JSON.parse(s);
  }

  $("#saveList").click(function(e) {
    var myData = makeObj($("#mySite"));
    console.log(myData);
    $.each(myData[0].items, function(key, item) {
      if (item.children) {
        myData[0].items[key].childObj = makeObj($("ul:eq(0) > li:eq(" + key + ") > ul"));
      }
    });
    console.log(stringify(myData));
    saveData = stringify(myData);
  });

  $("#loadList").click(function(e) {
    if (saveData.length) {
      console.log(saveData);
      var myData = parse(saveData);
      var newList = $("<ul>", {
        id: myData[0].id,
        class: myData[0].class
      }).insertAfter($(this));
      buildList(myData[0].items, newList);
      makeSort(newList, myData[0].class);
      $.each(myData[0].items, function(key, item) {
        if (item.children) {
          var sList = $("<ul>", {
            id: item.childObj[0].id || "",
            class: item.childObj[0].class
          }).appendTo($("li:eq(" + item.attr.index + ")", newList));
          buildList(item.childObj[0].items, sList);
          makeSort(sList, item.childObj[0].class);
        }
      });
    }
  });
});
代码语言:javascript
复制
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<ul id="mySite" class="mysite editor-ul">
  <li class="draggable editor-li editor-li-head">Headline</li>
  <li class="draggable editor-li" id="p-1">Item1
    <ul class="mysite editor-ul"></ul>
  </li>
  <li class="draggable editor-li" id="p-5">Item 2
    <ul class="mysite editor-ul">
      <li class="draggable editor-li" id="p-7" style="">Item 3
        <ul class="mysite editor-ul"></ul>
      </li>
      <li class="draggable editor-li" id="p-6" style="">Item 4
        <ul class="mysite editor-ul"></ul>
      </li>
    </ul>
  </li>
</ul>
<button id="saveList">Save</button>
<button id="loadList">Load</button>

上面的示例特定于显示保存和加载功能。若要测试,请单击“保存”,然后单击“加载”。结构保存到字符串中,并放入变量中。然后在load中,从字符串中读取并生成一个新副本。

这不是关于可排序的,而是更多关于保存和加载。您可以在stringify(makeObj())中使用update将数据发送到DB。如果您的列表更深,您将不得不对每个层重复几次makeObj()

当您从DB获得数据时,情况也是如此。它将作为一个字符串返回,您可以在其中使用parse(),或者它将作为一个对象返回。如果您使用PHP进行encode_json()并将JSON数据直接发送回脚本,情况就是如此。

发回字符串:

代码语言:javascript
复制
buildList(parse(data), $(".target"));

发回JSON:

代码语言:javascript
复制
buildList(data, $(".target"));

正如你所看到的,它会变得相当复杂。最好是找到一个插件,可以为你做繁重的工作。记住,这只是一个例子,也许不是你所做的最好的例子。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54193761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档