【问题标题】:TODO List updating with ajax使用 ajax 更新 TODO 列表
【发布时间】:2017-04-17 16:07:53
【问题描述】:

所以我有一个简单的待办事项列表,当我点击一个 li 项目时,我通过 ajax 调用将我的数据库中的字段 completed 更新为 1 或 0。

显然,我认为代码不好,而且它当然不起作用。只有第一次,当我单击 li 时,它确实会更新,但如果我希望它再次工作,我需要刷新,因为 data-completed 没有更新。我需要 jquery 来做到这一点,但我不知道如何根据原始值将数据属性更新为 1 或 0。

任何关于如何使其正常工作的指针将不胜感激。

查看:

<li data-id='{!! $task->id !!}' data-completed='@if($task->completed == '1') 0 @else 1 @endif'>

AJAX 调用:

$('li').on('click', function(e){
    $.ajax({
        url: 'api/tasks/update/'+$(this).data('id')+'/'+$(this).data('completed'),
        method: 'GET'
    })
});

由于我使用的是 laravel,所以这是我的路线:

Route::get('api/tasks/update/{id}/{completed}', function($id, $completed) {
    $task = App\Task::find($id);

    $task->completed = $completed;

    $task->save();
});

【问题讨论】:

    标签: jquery ajax laravel


    【解决方案1】:

    您需要在这里做几件事:

    首先,如果您已经在数据库中保存了 0/1,则不需要 if 语句,因此您可以简化视图部分:

    <li data-id='{!! $task->id !!}' data-completed='{{ $task->completed }}'>
    

    其次,您需要返回更新后的任务,以便您可以更新视图:

    Route::get('api/tasks/update/{id}/{completed}', function($id, $completed) {
        $task = App\Task::find($id);
    
        $task->completed = $completed;
    
        $task->save();
    
        return response()->json($task);
    });
    

    然后,更新您的 ajax 调用,以便在返回更新后的 task 时,您可以更新您的列表:

    $('li').on('click', function(e){
        var completed = (!$(this).data('completed') ? 1 : 0);
        $.ajax({
            url: 'api/tasks/update/'+$(this).data('id')+'/'+$(this).data('completed'),
            method: 'GET',
            success: function(data) {
              $(this).data('completed', data.completed);
           },
        })
    });
    

    我还会做的是将您的路由和 AJAX 调用更新为POST,因为这只是您更新数据时的好习惯:

    PHP

    Route::post('api/tasks/update/{id}', function(Request $request, $id) {
        $task = App\Task::find($id);
    
        $completed = $request->input('completed');
    
        $task->completed = $completed;
    
        $task->save();
    
        return response()->json($task);
    });
    

    JS

    $('li').on('click', function(e){
        $.ajax({
            url: 'api/tasks/update/'+$(this).data('id'),
            data: {completed: (!$(this).data('completed') ? 1 : 0)},
            method: 'POST',
            success: function(data) {
              $(this).data('completed', data.completed);
           },
        })
    });
    

    【讨论】:

    • 谢谢,就像一个魅力,除了一件事。使用上述内容,数据库不会更新,因为 completed 的反向应该在 ajax 调用中传递,而不是我从数据库中获得的值。我尝试了data: {completed: !$(this).data('completed')},,但带有感叹号的传递的值是true 或false,这很好,但它不会将数据库中的值设置为0 或1 之类的这个。有什么建议吗?
    • 我在三元组中添加了将真/假值转换为它们的 1/0 对应值,这应该适合你。您也可以在控制器中执行此操作,但将正确的值发送到控制器而不是在那里转换更有意义。
    • 非常感谢,我了解三元和 PHP 中的所有内容,但是当涉及到 javascript 时,我迷路了。我需要遵循一些教程才能更好地理解它:)
    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多