2009-10-09 6 views
1

J'ai un contrôle utilisateur qui permet aux utilisateurs ont fourni leurs propres noms de script qui sont appelés par le contrôle sur les événements spécifiques.JavaScript - Comment appeler une fonction à partir d'un nom de chaîne et passer un objet tableau?

J'ai le code suivant:

initialize : function() 
{ 

    // Call the base initialize method 
    Point74.WebAutoComplete.callBaseMethod(this, 'initialize'); 

    $(document).ready(
     Function.createDelegate(this, this._onDocumentReady) 
    ); 

}, 

_onDocumentReady : function() 
{ 
    var me = this; 
    $("#" + me.get_id()).autocomplete(me.get_ashxAddress(), 
     { 
      formatItem: function(item) 
      { 
       return eval(me.get_formatFunction() + "(" + item + ");"); 
      } 
     } 
    ).result(me.get_selectFunction()); 
} 

me.get_formatFunction contient le nom d'une fonction, à savoir "FormatItem". Cet exemple utilise actuellement eval, que je ne veux pas utiliser ... ainsi que cet exemple ne fonctionne pas de toute façon, mais je pensais que je montre ce que je veux en venir.

Dans l'exemple ci-dessus, je reçois une valeur erreur non définie comme « élément » est un tableau de chaînes et eval tente de le convertir en une longue chaîne.

Comment puis-je obtenir cette fonctionnalité tout encore être autorisés par « article » comme un tableau de chaînes à la fonction nommée?

Si le passage des fonctions nommées est une mauvaise idée, sont-il des alternatives?

Voici comment mon contrôle est déclaré:

<p74:WebAutoComplete runat="server" ID="ato_Test" AshxAddress="WebServices/SearchService.ashx" 
    FormatFunction="formatItem" SelectFunction="searchSelectedMaster" /> 
+0

Combien de fois par semaine est-ce que cela va être demandé? Première dup: http://stackoverflow.com/questions/359788/javascript-function-name-as-a-string –

+0

Une autre dup: http://stackoverflow.com/questions/1144297/ways-to-call-a- javascript-function-using-the-value-of-a-string-variable/1144334 # 1144334 –

Répondre

3
me[me.get_formatFunction()](item); 
+0

La seule différence était que je devais utiliser window [] au lieu de moi []. – GenericTypeTea

+0

Oui, si vous le définissez comme une fonction globale, vous utilisez window []. Si vous le définissez sur un prototype d'objet auquel vous faites référence, alors vous utilisez moi [] –

1

Je ne suis pas sûr de ce que votre plan d'ensemble est, mais vous pouvez passer des fonctions autour d'eux au lieu de leurs noms:

function Foo(x, y) { 
    // do something 
} 

function Bar(f, a, b) { 
    // call Foo(a,b) 
    f(a,b); 
} 

Bar(Foo, 1, 2); 
1

Si votre intention est de passer tous les arguments à la fonction spécifiée par l'utilisateur qui sont passés à formatItem(), alors au lieu d'utiliser:

formatItem: function(item) 
{ 
return eval(me.get_formatFunction() + "(" + item + ");"); 
} 

Utilisation:

formatItem: function() 
{ 
return me.get_formatFunction().apply(me, arguments)); 
} 

Le procédé applique() peut être appelée sur un objet de fonction, afin d'appeler cette fonction à l'aide du spécifié « ce » et tableau d'arguments. Voir: http://odetocode.com/blogs/scott/archive/2007/07/04/function-apply-and-function-call-in-javascript.aspx pour une explication des fonctions call() et apply() en javascript.

Ensuite, vous voudrez que get_formatFunction() renvoie un objet fonction, plutôt que le nom de la fonction; ou vous pouvez essayer:

me[me.get_formatFunction()] 

... pour obtenir une fonction qui est définie sur 'moi' par son nom. (Notez que si get_formatFunction() retourne la chaîne « myFunc », alors cela équivaut à me.myFunc)

[Edit: changé les références à « ceci » à utiliser « moi » au lieu]

+2

window [get_formatFunction()] fonctionnera si la fonction est définie dans la portée globale. Il pourrait avoir été défini comme un prototype d'objet. –

Questions connexes