coldfusion - ¿Cómo llamar dinámicamente una función que es parte de un cfc instanciado, sin usar Evaluate()?
(4)
Puedes usar cfinvoke. No tiene que especificar un componente.
<cfinvoke method="application.#funcName#" argumentCollection="#params#">
Por ejemplo, quiero poder acceder programáticamente a una línea de código como la siguiente, donde el nombre de la función se asigna dinámicamente sin utilizar Evaluar (). El código a continuación, por supuesto, no funciona, pero representa lo que me gustaría hacer.
application.obj[funcName](argumentCollection=params)
La única forma que puedo encontrar para invocar dinámicamente una función es usando cfinvoke, pero hasta donde puedo decir que ejemplifica el cfc / función relacionado sobre la marcha y no puede usar un cfc previamente instanciado.
Gracias
Según los documentos, puedes hacer algo como esto:
<!--- Create the component instance. --->
<cfobject component="tellTime2" name="tellTimeObj">
<!--- Invoke the methods. --->
<cfinvoke component="#tellTimeObj#" method="getLocalTime" returnvariable="localTime">
<cfinvoke component="#tellTimeObj#" method="getUTCTime" returnvariable="UTCTime">
Debería poder simplemente llamarlo con method = "# myMethod #" para llamar dinámicamente a una función en particular.
También puedes hacer algo muy parecido a la forma en que querías usarlo. Puede acceder al método dentro del objeto utilizando la sintaxis que utilizó, simplemente no puede llamarlo al mismo tiempo. Sin embargo, si lo asigna a una variable temporal, puede llamarlo
<!--- get the component (has methods ''sayHi'' and a method ''sayHello'') --->
<cfset myObj = createObject("component", "test_object")>
<!--- set the function that we want dynamically then call it (it''s a two step process) --->
<cfset func = "sayHi">
<cfset funcInstance = myObj[func]>
<cfoutput>#funcInstance("Dave")#</cfoutput>
<cfset func = "sayHello">
<cfset funcInstance = myObj[func]>
<cfoutput>#funcInstance("Dave")#</cfoutput>
En CFML, las funciones son miembros de primera clase del lenguaje. Esto nos permite pasarlos como una variable. En el siguiente ejemplo copiaré la función llamada ''foobar'' y la cambiaré de nombre "$ fn" dentro del mismo objeto. Entonces, simplemente podemos llamar a $ fn ().
funcName = ''foobar'';
application.obj.$fn = application.obj[funcName];
application.obj.$fn(argumentCollection=arguments);
El contexto de la función es importante, especialmente si hace referencia a cualquier valor en el ámbito ''variables'' o ''este'' del objeto. Nota: ¡esto no es seguro para subprocesos para instancias de CFC en ámbitos compartidos!
El método más rápido es usar la recomendación de Ben Doom. Solo quería ser minucioso.