Question

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.

Je 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 suis en train de dire.

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 essaye 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" />
Était-ce utile?

La solution

me[me.get_formatFunction()](item);

Autres conseils

Si votre intention est de passer tous les arguments à la fonction spécifiée par l'utilisateur qui sont transmis à formatItem (), puis 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 de l'appel () et appliquer ( ) fonctionne en JavaScript.

Alors, vous voulez get_formatFunction () pour renvoyer un objet de 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]

Je ne sais pas 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top