使用 jQuery 的 extend(true,{},{},{}) 方法会导致 springmvc 参数映射错误呢?详细如下:

2016-08-24 11:11:57 +08:00
 palmers

在使用 zTree 的时候,为了统一设置,就提取了一些公共的部分作为公共函数:类似这样:

zTreeInit:function(treeID,zOpts,data,callback) {

    //zTree arguments obj default
    var zTree_arg = {

     setting : {
       //其他设置,省略

      async: {
       //Set zTree asynchronous loading mode on/off.
       enable: false,//closed
       url: "http://host/getNode.ht",
       autoParam: [],
       contentType: "application/json",
       dataFilter: null,//ajaxDataFilter, //function callback
       dataType: "text",
       otherParam: null,
       type: "post"
      }
     }
    } ;

    zOpts = zOpts || {} ;

    $.extend(true,{},zTree_arg,zOpts) ;

    //init
    this.rootObj = $.fn.zTree.init($("#"+treeID),zTree_arg.setting,data) ;

    if(typeof callback === "function") {
     callback.call(arguments);
    }

   }

这样,调用者传递异步加载请求参数的时候节点async会变成这样:

     async: {
	    		enable: true,
	    		url: url,
	    		otherParam: {
	    			cTenantId: v1,
	    			userId: v2
	    		}
	    	}

这时候,服务器端方法接收上面两个参数方式如下:

public String fun(String cTenantId, String userId)  {
     // do sth
}

如此: 方法fun 不能接收到前端传递过来的这两个参数的值(值为 null),当我改变公共函数参数的拷贝方式如下:


$.extend(true,zTree_arg,zOpts) ;

或者


$.extend(false,{},zTree_arg,zOpts) ;

就可以正常接收了,我看了下 jQuery 的 extend 方法,没有看明白,看到一半就蒙了,请明白的 V 友给我讲解下,非常感谢! 我不想这么不明不白的解决问题。

非常感谢!

jQuery : v1.11.1 ; zTree: v3.5

2592 次点击
所在节点    Node.js
4 条回复
haozhang
2016-08-24 15:27:13 +08:00
打开 chrome 的调试工具看看 ztree async 发送到服务器的 xhr 里面有没有那两个参数,应该是 get 请求的 xhr ,参数附在 URL 的 query string 上面,如果没有的话,你也可以选择不用 async 这个属性,你可以在 ztree 提供的钩子函数中使用$.ajax ,比如在渲染 ztree 的目录视图之前会执行的钩子函数之类的。
palmers
2016-08-24 19:37:02 +08:00
@haozhang 谢谢~~ 你说的是回调函数吗? 你是指 setting.callback.beforeAsync 吗? http://www.treejs.cn/v3/api.php
haozhang
2016-08-24 21:59:39 +08:00
@palmers 具体是哪个函数我不清楚,但是一定要是在 ztree 渲染之前就行了。其实 async 属性也就是那样,在渲染之前根据 async 对象的参数去请求数据然后再渲染,你要做的和他一样,我觉得 async 没有问题,应该是你写的有问题。
palmers
2016-08-26 10:32:38 +08:00
@haozhang 我知道我可能哪里用错了,但是不知道具体地方,我仔细看了使用错误的方法去请求的时候请求参数是有的 xx=a&yy=b

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/301414

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX