Pregunta

Tengo un control de usuario que permite a los usuarios siempre que sus propios nombres de script que se llaman por el control sobre los eventos específicos.

Tengo el siguiente código:

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 el nombre de una función, es decir, "FormatItem". En este ejemplo se utiliza actualmente eval, que no quiero usar ... además este ejemplo no funciona de todos modos, pero pensé que iba a presentar lo que estoy tratando de llegar a.

En el ejemplo anterior, me sale un error indefinido valor como 'elemento' es una matriz de cadenas y eval intenta convertirlo en una cadena larga.

¿Cómo puedo conseguir esta funcionalidad todavía pasan a través de cualquier 'elemento' como una matriz de cadenas a la función llamada?

Si pasa funciones con nombre es una mala idea, ¿hay alternativas?

Así es como se declara mi control:

<p74:WebAutoComplete runat="server" ID="ato_Test" AshxAddress="WebServices/SearchService.ashx" 
     FormatFunction="formatItem" SelectFunction="searchSelectedMaster" />
¿Fue útil?

Solución

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

Otros consejos

Si su intención es pasar todos los argumentos de la función especificada por el usuario que se transmiten a formatItem (), a continuación, en lugar de utilizar:

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

Uso:

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

El método de aplicación () puede ser llamado en un objeto de función, con el fin de invocar esa función mediante el "este" y matriz de argumentos especificado. Ver: http://odetocode.com/blogs/scott/archive/2007/07/04/function-apply-and-function-call-in-javascript.aspx para una explicación de la llamada () y aplicar ( ) funciona en JavaScript.

A continuación, tendrá que get_formatFunction () para devolver un objeto función, en lugar de sólo el nombre de la función; o puede probar:

me[me.get_formatFunction()]

... para obtener una función que se define en el 'yo' por su nombre. (Tenga en cuenta que si get_formatFunction () devuelve la cadena 'myFunc', entonces esto es equivalente a me.myFunc)

[Editar: cambiar las referencias a 'esto' para usar 'yo' en vez]

No estoy seguro de lo que es su plan general, pero se pueden pasar funciones alrededor de sí mismos en lugar de sus nombres:

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

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

Bar(Foo, 1, 2);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top