Domanda

Ho un controllo utente che consente agli utenti forniti i propri nomi di script che vengono chiamati dal controllo su eventi specifici.

Ho il seguente codice:

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 contiene il nome di una funzione, vale a dire "FORMATtutti". Questo esempio sta attualmente utilizzando eval, che io non voglio usare ... oltre a questo esempio non funziona comunque, ma ho pensato di mostrare quello che sto cercando di arrivare.

Nell'esempio precedente, ottengo un errore non definito valore come 'oggetto' è un array di stringhe e eval cerca di convertirlo in una lunga serie.

Come posso ottenere questa funzionalità qualsiasi ancora passare attraverso il 'punto' come una matrice di stringhe alla funzione denominata?

Se il passaggio di funzioni con nome è una cattiva idea, ci sono delle alternative?

Questo è come il mio controllo è dichiarato:

<p74:WebAutoComplete runat="server" ID="ato_Test" AshxAddress="WebServices/SearchService.ashx" 
     FormatFunction="formatItem" SelectFunction="searchSelectedMaster" />
È stato utile?

Soluzione

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

Altri suggerimenti

Se il vostro intento è quello di passare tutti gli argomenti alla funzione specificata dall'utente che vengono passati al FORMATtutti (), quindi invece di usare:

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

Usa:

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

Il metodo apply () può essere chiamato su un oggetto funzione, al fine di invocare tale funzione utilizzando il "questo" e matrice argomento specificato. Vedere: http://odetocode.com/blogs/scott/archive/2007/07/04/function-apply-and-function-call-in-javascript.aspx per una spiegazione della chiamata () e applicare ( ) funzioni in JavaScript.

Poi si desidera get_formatFunction () per restituire un oggetto funzione, piuttosto che solo il nome della funzione; oppure si può provare:

me[me.get_formatFunction()]

... per ottenere una funzione che è definita su 'me' con il suo nome. (Si noti che se get_formatFunction () restituisce la stringa 'myFunc', allora questo è equivalente a me.myFunc)

[Modifica: cambiato i riferimenti a 'questo' usare 'me', invece]

Non sono sicuro di ciò che il piano generale è, ma è possibile passare funzioni attorno a se stessi, invece dei loro nomi:

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

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

Bar(Foo, 1, 2);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top