反思:
国产总是不尽人意, 但是要支持国产.
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 数据.
国产的库和框架, 需要加油啊.
来源: http://www.bubuko.com/infodetail-3778973.html