【问题标题】:Sort and Save table data using jquery sortable使用 jquery sortable 对表数据进行排序和保存
【发布时间】:2021-06-16 07:55:22
【问题描述】:

您好,我正在尝试设置一个包含父子数据的表,可以使用 jquery 可排序库对其进行排序,我能够获取数据的位置和各自的 ID,但无法将其发送到控制器使用 jquery

HTML 部分:

<tbody class="sort">
                      @foreach($menus as $menu)
                        <tr id = "{{ $menu->id }}" class="parent">
                            <td>{{$menu->name}}</td>
                            <td>{{ $menu->link }}</td>
                            @if($menu->sub == 1)
                            <td>Active</td>
                            @else
                            <td>In-Active</td>
                            @endif
                            <td class="text-right" >
                                <a href="{{ route("menu.edit", $menu->id) }}" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Edit"><i class="fe-edit-2" ></i></a>
                                    <button data-toggle="tooltip" data-placement="top" data-id="{{$menu->id}}" title="" data-original-title="Delete" class="delete btn btn-danger ml-1 "  type="submit"><i class="fas fa-trash-alt"></i></button>        
                            </td>
                            @if(count(App\Menu::where('parent_id',$menu->id)->orderBy('position','asc')->get())>0)
                                @foreach(App\Menu::where('parent_id',$menu->id)->orderBy('position','asc')->get() as $child)
                                    <tr id="{{ $child->id }}">
                                        <td>~{{$child->name}}</td>
                                        <td>{{ $child->link }}</td>
                                        <td></td>
                                        <td class="text-right" >
                                            <a href="{{ route("menu.edit", $child->id) }}" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Edit"><i class="fe-edit-2" ></i></a>
                                                <button data-toggle="tooltip" data-placement="top" data-id="{{$child->id}}" title="" data-original-title="Delete" class="delete btn btn-danger ml-1 "  type="submit"><i class="fas fa-trash-alt"></i></button>        
                                        </td>
                                    </tr>
                                @endforeach
                            @endif
                        </tr>
                      @endforeach
                    </tbody>

jQuery部分:

$(document).ready(function(){
        $('.sort').sortable({
            stop:function(event, ui){
                var parameter = new Array();
                var position = new Array();
                $('.sort>tr').each(function(){
                    parameter.push($(this).attr("id"));
                });
                $(this).children().each(function(index) {
                    position.push(index + 1);
                });
            
                $.ajax({
                    url:"{{ route('menu.savePosition') }}",
                    method:"POST",
                    data:{"id":parameter,"position":position},
                    success:function(response){
                        console.log(response);
                    },
                    error:function(xhr,response){
                        console.log(xhr.status);
                    }
                });
            },

        }).disableSelection();
});

控制器部分:

public function SavePosition(Request $req){
        $position = ($req->all());
        return $req->all();
        // foreach($file as $pos){
        //     $id = $pos[1];
        //     $position = $pos[0];
        //     $menu = Menu::findOrFail($id);
        //     $menu->position = $position;
        //     $menu->save();
        // }

    }

在这一切之后,控制台如下所示:

请帮我解决问题

任何帮助将不胜感激

提前致谢

【问题讨论】:

  • 在浏览器控制台的“Network->XHR”中检查是否触发了ajax请求。

标签: ajax laravel jquery-ui


【解决方案1】:

考虑以下示例。

$(function() {
  $(".sort").sortable({
    items: "> tbody > tr",
    stop: function(event, ui) {
      var parameter = $(this).sortable("toArray");
      var position = [];
      $.each(parameter, function(index, value) {
        position.push(index + 1);
      });
      console.log(parameter, position);
      $.ajax({
        url: "{{ route('menu.savePosition') }}",
        method: "POST",
        data: {
          "id": parameter,
          "position": position
        },
        success: function(response) {
          console.log(response);
        },
        error: function(xhr, status, error) {
          console.log(status, error);
        }
      });
    }
  });
});
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" integrity="undefined" crossorigin="anonymous">
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="container">
  <table class="sort" width="340">
    <thead>
      <tr>
        <th>Name</th>
        <th>Link</th>
        <th>Status</th>
        <td></td>
      </tr>
    </thead>
    <tbody>
      <tr id="item-1">
        <td>Item 1</td>
        <td>Link 1</td>
        <td>Active</td>
        <td class="text-right">
          <a href="menu_edit.asp?id=item-1" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Edit"><i class="fe-edit-2" ></i></a>
          <button data-toggle="tooltip" data-placement="top" data-id="item-1" title="" data-original-title="Delete" class="delete btn btn-danger ml-1 " type="submit"><i class="fas fa-trash-alt"></i></button>
        </td>
      </tr>
      <tr id="item-2">
        <td>Item 2</td>
        <td>Link 2</td>
        <td>Active</td>
        <td class="text-right">
          <a href="menu_edit.asp?id=item-2" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Edit"><i class="fe-edit-2" ></i></a>
          <button data-toggle="tooltip" data-placement="top" data-id="item-2" title="" data-original-title="Delete" class="delete btn btn-danger ml-1 " type="submit"><i class="fas fa-trash-alt"></i></button>
        </td>
      </tr>
      <tr id="item-3">
        <td>Item 3</td>
        <td>Link 3</td>
        <td>Active</td>
        <td class="text-right">
          <a href="menu_edit.asp?id=item-3" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Edit"><i class="fe-edit-2" ></i></a>
          <button data-toggle="tooltip" data-placement="top" data-id="item-3" title="" data-original-title="Delete" class="delete btn btn-danger ml-1 " type="submit"><i class="fas fa-trash-alt"></i></button>
        </td>
      </tr>
      <tr id="item-4">
        <td>Item 4</td>
        <td>Link 4</td>
        <td>Active</td>
        <td class="text-right">
          <a href="menu_edit.asp?id=item-4" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Edit"><i class="fe-edit-2" ></i></a>
          <button data-toggle="tooltip" data-placement="top" data-id="item-4" title="" data-original-title="Delete" class="delete btn btn-danger ml-1 " type="submit"><i class="fas fa-trash-alt"></i></button>
        </td>
      </tr>
      <tr id="item-5">
        <td>Item 5</td>
        <td>Link 5</td>
        <td>Active</td>
        <td class="text-right">
          <a href="menu_edit.asp?id=item-5" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Edit"><i class="fe-edit-2" ></i></a>
          <button data-toggle="tooltip" data-placement="top" data-id="item-5" title="" data-original-title="Delete" class="delete btn btn-danger ml-1 " type="submit"><i class="fas fa-trash-alt"></i></button>
        </td>
      </tr>
    </tbody>
  </table>
</div>

不清楚为什么要发送位置,因为项目数组已经按照项目的顺序排列。我确实包含了它,以防万一您确实需要它来做其他事情。

使用toArray 方法更容易:https://api.jqueryui.com/sortable/#method-toArray 您还需要正确定义items,以便Sortable 知道项目应该是什么。

【讨论】:

    【解决方案2】:

    试试这个方法。

    $('#element').sortable({
        axis: 'y',
        update: function (event, ui) {
            var data = $(this).sortable('serialize');
    
            // POST to server using $.post or $.ajax
            $.ajax({
                data: data,
                type: 'POST',
                url: '/your/url/here'
            });
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多