带有可选参数的Jquery ajax包装器

时间:2010-11-09 19:56:07

标签: asp.net jquery ajax

我希望有人可以帮我解决以下问题:因为我打破了我的小脑袋!我已经创建了一个包装器,因此我可以使用jquery轻松调用webservices / pagemethod。现在在ajax调用的成功函数中我希望能够调用一个函数(带有可选参数)我已经完成了以下操作但是我不确定我是否是正确的方向:

function AjaxMethod(path, fn, paramArray, returnParamArray, successFn, errorFn) {

var paramList = '';
if (paramArray.length > 0) {
    for (var i = 0; i < paramArray.length; i += 2) {
        if (paramList.length > 0) paramList += ',';
        paramList += '"' + paramArray[i] + '":"' + paramArray[i + 1] + '"';
    }
}

paramList = '{' + paramList + '}';

if (returnParamArray.length > 0) {
    $.ajax({
        type: "POST",
        url: path + "/" + fn,
        contentType: "application/json; charset=utf-8",
        data: paramList,
        dataType: "json",
        success: function () {
            var strFun = successFn;
            var strParam = returnParamArray;
            var funcCall = strFun + "('" + strParam + "');";
            //Call custom function with parameter array
            var ret = eval(funcCall);
        },
        error: errorFn
    })
}
else {
    $.ajax({
        type: "POST",
        url: path + "/" + fn,
        contentType: "application/json; charset=utf-8",
        data: paramList,
        dataType: "json",
        success: successFn,
        error: errorFn
    })
}

;}

我可以调用该函数,但似乎无法传递参数。我是朝着正确的方向前进还是走完了这条路?甚至可以将参数/值作为数组传递。或者有更简单的方法来实现这一目标。

顺便说一下,我需要这个函数来构成以下(原理图)动作:

1)用户使用数据删除表中的行 - DeleteRow(rowindex)

2)DeleteRow调用AjaxMethod删除数据库中的行

3)在成功事件中,我希望直观地删除特定行,因此我需要在successfunction中提供所选的rowindex。还有其他一些场景,所以它需要非常动态。

我也可以将这些信息存储在像CurrentDeletedIndex这样的全球变量中,但我希望它能够像我一样思考。

如果不随意问我,我希望自己有点清楚。

感谢您的时间。

亲切的问候, 标记

2 个答案:

答案 0 :(得分:0)

您需要使用apply方法

因此,不是使用eval,而是尝试创建参数的String表示,请使用此

window[successFn].apply(null, paramArray);

答案 1 :(得分:0)

  1. 这不起作用
  2. 这很糟糕; eval is evil
  3. 这样做的正确方法非常简单。首先,我们需要创建对象 paramList,而不是 string 表示。我们可以这样做:

    var paramList = {};
    for(var i=0; i<paramArray.length; i+=2) {
        paramList[paramArray[i]] = paramArray[i+1];
    } // note: make sure the array size is even.
    

    现在为成功功能:

    var ret = successFn(paramList);
    

    注意:如果successFn作为字符串传递,请将window[successFn]用于全局范围,或window.some.scope[successFn]用于特定范围,我全心全意地建议您将实际函数作为参数,而不是一些字符串。这对于无法访问的作用域中的匿名函数和函数很有用。哦,这也是正确的做事方式