2010-11-09 3 views
1

Я надеюсь, что кто-то может помочь мне со следующим сценарием, потому что я разбиваю свою маленькую голову над этим! Я сделал обертку, поэтому я могу легко вызвать webservices/pagemethod с помощью jquery. Теперь в функции успеха вызова AJAX Я хочу, чтобы иметь возможность вызвать функцию (с дополнительными параметрами) я сделал следующее, но я не уверен, если я в правильном направлении:Обертка JQuery 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) Пользователь deletetes строки из таблицы с данными - DeleteRow (RowIndex)

2) DeleteRow называет AjaxMethod для удаления строки из базы данных

3) При успешном событии я хочу, чтобы конкретная строка была удалена визуально, поэтому мне нужен выбранный rowindex, доступный в функции success. Есть еще несколько сценариев, поэтому нужно быть действительно динамичным.

Я также могу хранить эту информацию в глобальных vars, таких как CurrentDeletedIndex, но я надеюсь, что это возможно так, как я думал.

Надеюсь, я сделал себя немного понятным, если не расспрашиваю.

Спасибо за ваше время.

С наилучшими пожеланиями, Все

ответ

0
  1. Это не сработает
  2. Это плохо; eval is evil

Правильный способ сделать это довольно просто. Во-первых, нам нужно сделать объектparamList, а не его строка представление. Мы можем сделать это следующим образом:

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] для конкретный масштаб, и я всем сердцем предлагаю вам принять фактическую функцию как параметр, а не некоторую строку. Это полезно для анонимных функций и функций из недоступных областей.О, и это тоже способ делать вещи

+0

successFn передается как строка. Это не будет работать. –

+0

@Josiah Ruddell исправлено, спасибо! –

+0

Спасибо, Gabi en Josiah за ваше разъяснение, теперь функция успеха работает, но как мне получить результат (как результат ajax, так и возвращаемый paramlist) в функции успеха. Извините, я все еще учился, но спасибо вам большое! – Mark

0

Вы должны использовать метод apply

Таким образом, вместо того, чтобы использовать Eval, и пытается создать представление строка параметров использовать этот

window[successFn].apply(null, paramArray); 
Смежные вопросы