做到这里,慢慢发现用ajax设计后台,许多地方还是要做改动的。
出现的问题:
1.局部刷新的部分,载入新页面后,js失效了
解决:给需要局部刷新的链接加上指定类名ajax,然后添加属性info写上地址,(其实是事件绑定的原理)。
$(document).on('click','.ajax',function(){
var url=$(this).attr("info");
$("#ajaxshow").load(url,function(responseText,textStatus,XMLHttpRequest){
if(XMLHttpRequest.status==404 || XMLHttpRequest.status==500){
$("#ajaxshow").html("<p>error</p>");
}else{
}
})
});
2.点击添加,通过1的方法,我们局部区域出现了表单,但是点击后想提交到控制器并处理,但是不想跳转到别的地方,还在局部区域显示信息。这个时候你用form中的action就不行了,那样就会跳走。这个时候我们可能会想,之前怎么实现的,现在还能用1的方式吗?
不行,因为这次还要带着表单中的数据过去,
解决:我们把的action和method去掉,只留个空架子在那里,具体的实现和表单提交没有任何关系:
$(document).on('click','.submit',function(){
var username=$('#username').val();
var password=$('#password').val();
var email=$('#email').val();
$.post("/lolnews/public/admin/managerlist/add.html",
{'username':username,'password':password,'email':email},
function(data){
$('#ajaxshow').html(data);
})
return false;
});
3.添加的数据多了之后,我想到得给管理员列表来一个分页显示,这时我用paginate(5)代替了all()方法,然后在视图中{$list->render},此时导航是出来了,但是点击页码,无法在我们的局部区域进行更新,于是我窥探分页代码的结构,解决:
$(document).on('click','.pagination li a',function(){
var url=$(this).attr('href');
$(this).attr('href','javascript:void(0);');
$("#ajaxshow").load(url,function(responseText,textStatus,XMLHttpRequest){
if(XMLHttpRequest.status==404 || XMLHttpRequest.status==500){
$("#ajaxshow").html("<p>error</p>");
}else{
}
})
})
本节说得是新增,贴上控制器代码
<?php
namespace app\admin\controller;
use think\Controller;
use app\admin\model\Admin;
class ManagerlistController extends Controller
{
public function managerlist(){
//$list=Admin::all();
$list=Admin::paginate(5);
return view("manager",['list'=>$list]);
}
public function add(){
if(request()->isPost()){
$username=input('username');
$password=input('password');
$email=input('email');
$admin=new Admin;
$admin->username=$username;
$admin->password=$password;
$admin->email=$email;
if($admin->save()){
$url=url('admin/managerlist/managerlist');
return '用户:'.$admin->username.'新增成功'.'<br>'.'<a info="/lolnews/public/admin/managerlist/add.html" class="ajax">继续添加</a>'.'<br>'
.'<a info='.$url.' class="ajax">管理员列表</a>';
}else{
$admin->getError();
}
}else{
return view("add");
};
}
}
可以看出来,ajax提交过来的信息,正好也能以$_POST[”]来获取,这里用的是框架的input(”)助手函数,而且处理后的提示信息正好是return的,于是正好,可以成功的返回数据data,真是精彩至极!
犯得一个错误:以为jquery中的attr()设置属性是这样用的,
错误
$('').attr('href')='abc';
正确
$('').attr('href','abc');
关于获取地址:
注意在视图中{:url('admin/index/index')}
在控制器中url('admin/index/index'),是方法
在控制器字符串中只能用最原始的了,或者先用url()方法得到地址,赋值给变量,然后拼接到字符串中。
在js中,就没得搞咯,直接写原始的地址,或者把地址放到html元素,然后来获取。