2009-09-30 32 views
5

Tengo este json, y cuando llegue este json necesito ejecutar la función que viene en el objeto de devolución de llamada.¿Cómo pasar parámetros en eval en un formulario de objeto?

{ 
    formId: 'snn_service_item_form', 
    item_id: '1', 
    item_title: 'some item', 
    item_description: '', 
    item_duration: '10', 
    item_price: '120', 
    item_level_1 : 1, 
    item_level_2 : 0, 
    item_level_3 : 1, 
    item_type: 'p', 
    callback : { 
     callbackName : 'getServices', 
     callbackParams : { 
      _param1 : 1, 
      _param2 : 2 
    } 
} 
} 

lo que de acuerdo a esta i necesidad de ejecutar este:

getServices(1,2); 

que pueda hacer eso con la función eval como:

eval(json.callback.callbackName+'(\''+ json.callback.callbackNParams._param1 +'\',\''+ json.callback.callbackNParams._param2 +'\')'); 

i puede automatizar este poniéndolo en una de y escribir parámetros en una cadena, pero no creo que esta sea la mejor manera de hacerlo.

hay una manera de asignar una función a partir de una var y dando sus parámetros como un objeto, en mi caso como:

json.callback.callbackName(json.callback.callbackParams); 

Sé que esto no es la manera de hacerlo, pero es lo que yo querer aprender.

Gracias, Sinan.

+0

gracias por las respuestas, voy a trabajar en la llamada y aplicar para obtener esa ejecución. – Sinan

Respuesta

10

Depende de dónde se define la función a llamar (alcance global o ámbito local).

Si global, no es necesario eval (y es más seguro para evitarlo), que acaba de hacer referencia a la función a través de la window objeto global:

var args = []; 
for(var p in json.callback.callbackParams) { 
    args.push(json.callback.callbackParams[p]); 
} 
window[json.callback.callbackName].apply(null, args) 

Véase el apply() function utilizado anteriormente.

Si se trata de un ámbito local, entonces necesita el eval (cómo lo tiene está bien).

+0

Para un alcance local, puede usar el 'eval' solo para obtener el objeto de función, y aún así usar el' apply' más confiable para llamarlo. Por cierto, no está garantizado que 'for (in)' devuelva los parámetros en el orden que desee. – bobince

1

No utilice eval. Se puede obtener una referencia a una variable global llamada o función del objeto window:

var callbackfunction= window[json.callback.callbackName]; 

Y tratando de serializar sus valores en una cadena sólo para tenerlos analizan de nuevo a JavaScript poco fiable es tonta. Llame a la función explícita:

callbackfunction.call(window, json.callback.callbackParams.param1, json.callback.callbackParams.param2); 

(. window aquí es un valor ficticio para this para cuando no se esté usando métodos de objeto)

mejor para la automatización a aceptar cualquier número de parámetros sería convertir callbackParams en un array plano:

callbackParams: [1, 2] 

y luego usar apply llamar a la función:

callbackfunction.apply(window, json.callback.callbackParams); 
+2

'func.call (null, ...)' le dará el mismo (bueno, casi) comportamiento como 'func.call (window, ...)' - invocando la función con el valor 'this' como objeto global. Es más corto, aunque probablemente menos descriptivo para principiantes. – kangax

Cuestiones relacionadas