coldfusion cfc

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.