2010-11-09 6 views
1

J'espère que quelqu'un peut m'aider avec le scénario suivant parce que je me casse la tête! J'ai fait un emballage pour que je puisse facilement appeler webservices/pagemethod en utilisant jquery. Maintenant, dans la fonction de la réussite de l'appel ajax Je veux être en mesure d'appeler une fonction (avec des paramètres facultatifs) Je l'ai fait ce qui suit, mais je ne sais pas si je suis la bonne direction:Jquery ajax wrapper avec paramètres optionnels

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 
    }) 
} 

; }

Je suis capable d'appeler la fonction mais je ne peux pas sembler passer les paramètres. Suis-je dans la bonne direction ou est-ce complet sur le chemin? Est-il même possible de transmettre des paramètres/valeurs en tant que tableau. Ou existe-t-il un moyen plus simple d'accomplir cela?

Par la façon dont je besoin de cette fonction pour les actions (Schéma) suivantes:

1) L'utilisateur deletetes une ligne d'une table avec des données - DeleteRow (rowIndex)

2) DeleteRow appelle la AjaxMethod pour supprimer la ligne de la base de données

3) En cas de succès, je souhaite que la ligne spécifique soit supprimée visuellement, j'ai donc besoin de l'index de ligne sélectionné dans la fonction success. Il y a aussi quelques autres scénarios, il faut donc qu'il soit vraiment dynamique.

Je peux également stocker cette information dans des variables globales comme CurrentDeletedIndex mais j'espère que c'est possible comme je le pensais.

J'espère que je me suis fait un peu clair si je ne me sens pas libre de demander.

Nous vous remercions de votre temps.

Cordialement, Mark

Répondre

0
  1. Cela ne fonctionnera pas
  2. Ceci est mauvais; eval is evil

La bonne façon de procéder est assez simple. Tout d'abord, nous devons faire l'objet paramList, pas sa représentation chaîne. Nous pouvons le faire comme ceci:

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. 

maintenant pour la fonction de succès:

var ret = successFn(paramList); 

NOTE: si successFn est passé comme une chaîne, utilisez window[successFn] pour la portée globale ou window.some.scope[successFn] pour une portée spécifique, et je vous suggère de tout coeur de prendre la fonction réelle comme un paramètre, pas une chaîne. Ceci est utile pour les fonctions anonymes et les fonctions des étendues inaccessibles.Oh et c'est aussi le correct façon de faire

+0

successFn est transmis en tant que chaîne. Cela ne marchera pas. –

+0

@Josiah Ruddell fixé, merci! –

+0

Merci Gabi en Josiah pour votre clarification, la fonction de succès fonctionne maintenant, mais comment puis-je accéder au résultat (à la fois le résultat ajax et le retour paramlist) dans la fonction de succès. Désolé je continue à apprendre mais merci beaucoup! – Mark

0

Vous devez utiliser la méthode apply

Ainsi, au lieu d'utiliser eval, et d'essayer de créer une représentation de chaîne de paramètres utilisent cette

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