Laravel9中如何用Ajax无刷新在表格显示新增待办任务
修复步骤
1. 修正HTML结构错误
你用<div id="items">包裹<tr>标签违反了HTML规范,<tr>必须放在<tbody>、<thead>或<table>内部。浏览器会自动修正这个错误,导致#items选择器无法正确关联表格行,这是load方法无效的核心原因。
修改视图结构,将id="items"移到<tbody>上:
<table> <tbody id="items"> @php($menuCounter = 1) @forelse($tasks as $task) <tr> <td>{{ ++$menuCounter }}</td> <td class="ourItem" data-toggle="modal" data-target="#exampleModalCenter">{{ $task->task_name }}</td> </tr> @empty <tr> <td colspan="5" class="text-center">Nothing here to show</td> </tr> @endforelse </tbody> </table>
2. 修复后端控制器的Request类问题
你的create方法参数使用小写request $request会导致类找不到错误,必须使用大写Request并引入命名空间:
use Illuminate\Http\Request; class TaskListController extends Controller { public function index() { $tasks = Tasklist::all(); return view('admin.tasks.list',compact('tasks')); } public function create(Request $request) { // 可选:添加表单验证,防止空提交 $request->validate([ 'text' => 'required|string|max:255' ]); $item = new Tasklist(); $item->task_name = $request->text; $item->save(); // 方案一:继续用load方法时返回字符串 return 'Done'; // 方案二:更高效的方式,返回新任务的HTML片段(推荐) // return view('admin.tasks._task_item', compact('item')); } }
3. 优化Ajax回调逻辑
方案一:修复现有load方法
如果继续用load刷新列表,确保回调逻辑正确,并添加输入框清空、错误处理:
$('#AddButton').click(function(event){ event.preventDefault(); // 阻止按钮默认行为(若按钮在表单内) var text = $('#addItem').val().trim(); if (!text) { alert('请输入任务内容'); return; } $.post('tasks-list-add', {'text': text, '_token': $('input[name=_token]').val()}, function(data){ // 重新加载tbody内的所有元素,避免嵌套选择问题 $('#items').load(location.href + ' #items > *'); $('#addItem').val(''); // 清空输入框 }).fail(function(xhr){ console.error('请求失败:', xhr.responseText); alert('添加任务失败,请重试'); }); });
方案二:返回HTML片段直接追加(推荐)
这种方式无需请求整个页面,性能更优:
- 创建部分视图
resources/views/admin/tasks/_task_item.blade.php,内容为单个任务行:
<tr> <td>{{ $tasksCount + 1 }}</td> <td class="ourItem" data-toggle="modal" data-target="#exampleModalCenter">{{ $item->task_name }}</td> </tr>
- 修改控制器
create方法返回该视图:
public function create(Request $request) { $request->validate([ 'text' => 'required|string|max:255' ]); $item = new Tasklist(); $item->task_name = $request->text; $item->save(); // 获取当前任务总数,用于计算行号 $tasksCount = Tasklist::count(); return view('admin.tasks._task_item', compact('item', 'tasksCount')); }
- 修改Ajax回调:
$('#AddButton').click(function(event){ event.preventDefault(); var text = $('#addItem').val().trim(); if (!text) { alert('请输入任务内容'); return; } $.post('tasks-list-add', {'text': text, '_token': $('input[name=_token]').val()}, function(data){ // 移除空状态提示(若存在) $('#items').find('tr:contains("Nothing here to show")').remove(); // 追加新任务行 $('#items').append(data); $('#addItem').val(''); // 清空输入框 }).fail(function(xhr){ console.error('请求失败:', xhr.responseText); alert('添加任务失败,请重试'); }); });
4. 验证路由配置
确保路由为POST方法,指向正确的控制器方法:
use App\Http\Controllers\TaskListController; Route::post('/tasks-list-add', [TaskListController::class, 'create'])->name('tasks.add');
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

