反思:
国产总是不尽人意,但是要支持国产。
ThinkPHP的6接收ajax的post数据,存在一个bug。即ajax传递的json数据,在thinkphp后端解析出来后,并非直接的json格式。
描述:
三级联动,此处不赘述如何实现。以省市县为例,当点击省的下拉菜单时,我们设置监听函数:
layui.use(['form','cjgl'], function(){ var config = { s1: 'xunliandui_id', s2: 'xunlianying_id', s3: 'xunlianlian_id', v1: null,//默认的训练队id v2: null,//默认的训练营id v3: null,//默认的训练连id }; var form = layui.form; form.on('select(' + config.s1 + ')', function(data){ cityEvent(data); }); function cityEvent(data) { // alert('yes'); var $ = layui.jquery; var $form = $('form'); $form.find('select[name=' + config.s2 + ']').html(""); // alert('no'); var myjson = JSON.stringify({parent_id:data.value}); // $.post("/system/school/xiajidanwei",myjson,function(result){ // // },'JSON'); $.ajax({ url:"/system/school/xiajidanwei",//查询下级子单位 type:"post", data:myjson, dataType:'json', success:function(result){ if(result.code == 0) { alert('xxx'); $.each(result.data, function(index,item){ console.log(item); }); }else{ layer.msg(result.msg); } }, error:function(xhr,status,error) { layer.msg('数据处理错误',{ icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }); } }); } });
上述代码中,使用的是layui的jquery,无论是$.post还是$.ajax,其功能同。
当点击下拉菜单进行选择后,会执行js的cityEvent函数。
我们构造json字符串,即myjson。
但是,thinkphp后端利用$_POST接收的内容为:
因此,我们的后端需要特殊处理:
public function ajaxData2() { // 获取参数 $a=array(); $a[0]=1000; $src = $this->request ->only([ 'parent_id' => '' ],'POST'); // 实例化 // $parent_id=$_POST["parent_id"]; foreach($_POST as $key=>$value){ $key=json_decode($key); $parent_id=$key->{"parent_id"}; if($parent_id){ break; } } $sch = new sch; $data = $sch->where('status',1)->where('parent_id',$parent_id)->select(); $data = reSetObject($data, $src); return json($data); }
利用foreach取出$_POST的索引值,然后转化为json,再取出parent_id中的数据。
结论:
jquery.ajax以json传递的数据,在thinkphp6的后端,变成了数组的索引。而非json数据。
国产的库和框架,需要加油啊。