V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
palmers
V2EX  ›  Node.js

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

  •  
  •   palmers · 2016-08-24 11:11:57 +08:00 · 2592 次点击
    这是一个创建于 3045 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在使用 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

    4 条回复    2016-08-26 10:32:38 +08:00
    haozhang
        1
    haozhang  
       2016-08-24 15:27:13 +08:00
    打开 chrome 的调试工具看看 ztree async 发送到服务器的 xhr 里面有没有那两个参数,应该是 get 请求的 xhr ,参数附在 URL 的 query string 上面,如果没有的话,你也可以选择不用 async 这个属性,你可以在 ztree 提供的钩子函数中使用$.ajax ,比如在渲染 ztree 的目录视图之前会执行的钩子函数之类的。
    palmers
        2
    palmers  
    OP
       2016-08-24 19:37:02 +08:00
    @haozhang 谢谢~~ 你说的是回调函数吗? 你是指 setting.callback.beforeAsync 吗? http://www.treejs.cn/v3/api.php
    haozhang
        3
    haozhang  
       2016-08-24 21:59:39 +08:00
    @palmers 具体是哪个函数我不清楚,但是一定要是在 ztree 渲染之前就行了。其实 async 属性也就是那样,在渲染之前根据 async 对象的参数去请求数据然后再渲染,你要做的和他一样,我觉得 async 没有问题,应该是你写的有问题。
    palmers
        4
    palmers  
    OP
       2016-08-26 10:32:38 +08:00
    @haozhang 我知道我可能哪里用错了,但是不知道具体地方,我仔细看了使用错误的方法去请求的时候请求参数是有的 xx=a&yy=b
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1363 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:40 · PVG 01:40 · LAX 09:40 · JFK 12:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.