2

urljQuery ajax POSTリクエストで使用されるを生成する関数を実行しようとしていますが、urlパラメーターは文字列しかないようです...コードは次のとおりです。ajax呼び出しfunctionのパラメーターに注意してください。url

//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

問題を回避するのを手伝ってもらえますか? ありがとう!

4

2 に答える 2

9

関数を実行して結果を渡すのではなく、関数を渡します。すぐに呼び出される関数を使用できます。

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/

于 2013-09-26T13:07:46.553 に答える
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);
        }
    });
})
于 2013-09-26T13:11:25.320 に答える