【问题标题】:How to reload a view in laravel after insert with JQuery Ajax使用 JQuery Ajax 插入后如何在 laravel 中重新加载视图
【发布时间】:2017-06-15 09:56:53
【问题描述】:

我正在使用 jQuery ajax 将记录插入到表中。它工作正常并返回一条通知记录已成功插入的闪存消息。现在我的问题是在插入记录后我不知道如何重新加载我的表以便可以反映更改。

注意我在表格所在的同一页面上通过引导模式插入。

这是返回我的记录的控制器:

public function index()
{
    //
    $subjects = Subject::all();


    return view('subjects.show', compact('subjects'));
}

记录返回后,我是这样显示的:

<table class="table table-responsive table-hover table-condensed table-bordered">
                    <thead>
                        <tr>
                            <th>Name</th>
                            <th>Level</th>
                            <th colspan="2">Actions</th>
                        </tr>
                    </thead>
                    <tbody>
                        @foreach($subjects as $subject)
                            <tr>
                                <td>{{$subject->name}}</td>
                                <td>{{$subject->level}}</td>
                                <td>
                                    <a data-toggle="tooltip" title="Edit" href="#" role="button"><i class="glyphicon glyphicon-edit text-info"></i></a>
                                </td>
                                <td>
                                    <a data-toggle="tooltip" title="Edit" href="#" role="button"><i class="glyphicon glyphicon-trash text-danger"></i></a>
                                </td>

                            </tr>
                        @endforeach
                    </tbody>
                </table>

这是我插入记录的脚本:

$(document).on('submit', '#subject-form', function(event) {
            event.preventDefault();
            /* Act on the event */

            var name = $('#name').val();
            var level = $('#level').val();

            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });

            $.ajax({
                type: "POST",
                url: $("#subject-form").attr('action'),
                data: {name: name, level: level},
                success: function(response) {
                    console.log(response);

                    if (response.success) {
                        $.notify({
                            icon: 'glyphicon glyphicon-check',
                            message: response.success
                          },{
                              type: 'info',
                              timer: 4000,
                              offset: 20,
                              spacing: 10,
                              z_index: 1031,
                              delay: 5000,
                              placement: {
                                from: "bottom",
                                align: "right"
                              },

                              animate: {
                                enter: 'animated fadeInDown',
                                exit: 'animated fadeOutUp'
                              },
                        });
                    } else {
                        // display error
                    }

                    $('#subject-modal').modal('toggle');
                }
            });

这是插入记录并生成快速响应的控制器方法:

public function store(Request $request)
{
    //

   //return json_encode(request('name'));
    $response = array();

   if (Subject::create(request(['name', 'level']))) {

       $response['success'] = '<b>'.request('name').'</b>'.' created successfully';
   } else {
       $response['fail'] ='Error creating subject: <b>'.request('name').'</b>'.'. Try again, if problem persist contact administrator';
   }

    return \Response::json($response);


}

我有什么方法可以完成这项工作吗?感谢反馈和建议。谢谢!!!

【问题讨论】:

  • 为什么不在 JavaScript 中调用 window.location.reload() 呢?否则,您需要在浏览器中刷新 HTML 内容。 Ajax 也能够提供该内容。
  • @btl window.location.reload() 重新加载页面但不起作用将关闭我的对话框并显示我的 Flash 消息。如何刷新html内容?
  • 发出 AJAX 请求并使用 return response()->json($reponse); 返回新数据。然后在成功回调中将数据附加到您的 HTML 文档中。
  • @btl 在我的控制器存储方法中,我确定应该这样做,但现在根据我所拥有的,我可以返回响应和 Flash 消息吗?
  • @btl 我目前只返回带有响应字段的闪存混乱。

标签: javascript php jquery ajax laravel


【解决方案1】:

从控制器获取响应并将新行追加到表中。

        $.ajax({
            type: "POST",
            url: $("#subject-form").attr('action'),
            data: {name: name, level: level},
            success: function (response) {
                console.log(response);

                if (response.success) {
                    var html = '<tr>';
                    html = '        <td>' + response.subject.name + '</td>';
                    html = '<td>' + response.subject.level + '</td>';
                    html = '<td>';
                    html = '<a data-toggle="tooltip" title="Edit" href="#" role="button"><i class="glyphicon glyphicon-edit text-info"></i></a>';
                    html = '</td>';
                    html = '<td>';
                    html = '<a data-toggle="tooltip" title="Edit" href="#" role="button"><i class="glyphicon glyphicon-trash text-danger"></i></a>';
                    html = '</td>';
                    html = '</tr>';
                    $("table.table-responsive").append(html);
                    });
                } else {
                    // display error
                }

                $('#subject-modal').modal('toggle');
            }
        });

Controller代码

public function store(Request $request) {
    $response = array();
    $data["name"] = request('name');
    $data["level"] = request('level');
    $subject = Subject::create($data);
    if ($subject) {
        $response['success'] = '<b>' . request('name') . '</b>' . ' created successfully';
        $response['subject'] = $subject;
    } else {
        $response['fail'] = 'Error creating subject: <b>' . request('name') . '</b>' . '. Try again, if problem persist contact administrator';
    }

    return \Response::json($response);
}

【讨论】:

    【解决方案2】:

    对此有两种可能的解决方案。

    1. window.location.reload() 重新加载页面。
    2. 将新添加的记录作为响应发送,并在成功回调时将其附加到当前表中,以显示所有记录。 (无需重新加载)

    编辑

    您的控制器方法可能如下所示

    public function store(Request $request)
    {
        //
    
       //return json_encode(request('name'));
        $response = array();
    
       if ($subject = Subject::create(request(['name', 'level']))) {
    
           $response['success'] = '<b>'.request('name').'</b>'.' created successfully';
           $response['subject'] = $subject;
       } else {
           $response['fail'] ='Error creating subject: <b>'.request('name').'</b>'.'. Try again, if problem persist contact administrator';
       }
    
        return \Response::json($response);
    
    
    }
    

    现在您的响应数组有一个对象(新创建的主题记录),您可以通过成功回调中的subject 键访问它。

    给你的表一个 id 并使用 jquery 访问它以附加一个包含你的 subject 记录的 &lt;tr&gt; &lt;/tr&gt; 元素..

    【讨论】:

    • 我该如何做选项 2?
    • @NathanSiafa,检查编辑是否足以让您理解这个想法。
    • 我这样做了$('#subjects').append('&lt;td&gt;'+response.subject+'&lt;/td&gt;'),我得到了[object Object]
    • 让我知道我必须将 id 设置为 tbody 标签。
    • @Nathan Siafa 很高兴你完成了这项工作 :)
    【解决方案3】:

    您可以使用加载功能。给你的桌子一个 id 并在你想要的时候使用它:

    var url = '/page_adress';
    $('#table_id').load(url + '#table_id>*');
    

    【讨论】:

      猜你喜欢
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2013-06-03
      • 2018-03-27
      • 2019-06-24
      • 1970-01-01
      相关资源
      最近更新 更多