2013-09-26 76 views
2

我试图运行一个函数来生成用于jQuery ajax POST请求的url,但看起来url参数只能是一个字符串......这里是代码,note在url参数Ajax调用的functionjQuery中的url参数中的函数Ajax请求

//chained code upstairs... 
.bind("create.jstree", function (e, data) { 
    $.ajax({ 
     //"/project/<%= locals.project.handle %>/mkdir/<%=locals.filepath%>", 
     //"http://127.0.0.1/project/datanotes/mkdir/lolada/lolada_subdir", 
     type : "POST", 
     url : function(data){ 
      var url = "<%= locals.request.db.baseURI + "/project/" + locals.project.handle + "/mkdir" %>"; 
      if(data.rslt.obj.attr("id") != null){ 
       url = url + "/" + data.rslt.obj.attr("id"); 
      } 
      return url; 
     }, 
     data : { 
      "title" : data.rslt.name, 
      "type" : data.rslt.obj.attr("rel") 
     }, 
     success: function (r) { 
      if(r.status) { 
       $(data.rslt.obj).attr("id", "node_" + r.id); 
      } 
      else { 
       $.jstree.rollback(data.rlbk); 
      } 
     }, 
     failure : function (r) { 
      $.jstree.rollback(data.rlbk); 
     } 
    }); 
}) 

url参数被解释为一个字符串,并没有评估,作为调试日志如下:

GET /project/datanotes/browse/children 200 369ms - 2b 
POST /project/function%20(data)%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20url%20=%20%22http://127.0.0.1:3000/project/datanotes/mkdir%22;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(data.rslt.obj.attr(%22id%22)%20!=%20null)%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%20=%20url%20+%20%22/%22%20+%20data.rslt.obj.attr(%22id%22);%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20url;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D 404 5ms 

你能帮我circunve nt问题?谢谢!

+4

不知道,如果你能做到这一点还是不(你想要什么),但为什么AJAX调用之前有权不运行的功能,把它分配给一个变量,然后使用? – tymeJV

+0

确切地说,这是最好的解决方案,谢谢! –

回答

8

您正在传递函数,而不是执行它并传递结果。你可以使用一个立即调用函数:

url: (function() { 
    var url = "<%= locals.request.db.baseURI + "/project/" + locals.project.handle + "/mkdir " %>"; 

    if (data.rslt.obj.attr("id") != null) { 
     url = url + "/" + data.rslt.obj.attr("id"); 
    } 

    return url; 
})(), 

简单的演示:http://jsfiddle.net/yS6rn/

+0

感谢您花时间解释立即调用的函数。运作良好,是我不知道的:-) –

+0

虽然我永远不会考虑使用这种技术来解决这个特定的情况(因为它增加了不必要的复杂性)+1冷静:) –

+0

我倾向于同意..在这种情况下,这可能没有必要。但它提供了一种方法来使提问者的尝试解决方案有效,而且IIFE是一个很好的想法。 –

4

您所期望的功能仅需要一个字符串时进行评估。为什么过分复杂?只需计算AJAX调用之前的URL(但仍然在绑定函数中)。

//chained code upstairs... 
.bind("create.jstree", function (e, data) { 
    var url = "<%= locals.request.db.baseURI + "/project/" + locals.project.handle + "/mkdir " %>"; 

    if (data.rslt.obj.attr("id") != null) { 
     url = url + "/" + data.rslt.obj.attr("id"); 
    } 

    $.ajax({ 
     //"/project/<%= locals.project.handle %>/mkdir/<%=locals.filepath%>", 
     //"http://127.0.0.1/project/datanotes/mkdir/lolada/lolada_subdir", 
     type: "POST", 

     url: url, 

     data: { 
      "title": data.rslt.name, 
       "type": data.rslt.obj.attr("rel") 
     }, 
     success: function (r) { 
      if (r.status) { 
       $(data.rslt.obj).attr("id", "node_" + r.id); 
      } else { 
       $.jstree.rollback(data.rlbk); 
      } 
     }, 
     failure: function (r) { 
      $.jstree.rollback(data.rlbk); 
     } 
    }); 
}) 
+0

你说得对,简单总是比较好,我会采取你的方法;然而,立即调用的函数对我来说是一件新事物,因此我会接受其他答案,因为它教会了我一些新的东西,它也解决了这个问题。尽管如此,我仍会赞成,谢谢! –

+1

这很酷......我也对它印象深刻。 Javascript中的所有函数显然只是字符串...打开一些有趣的可能性,用于自修改代码! :) –