Как динамически вызвать функцию, которая является частью созданного экземпляра cfc, без использования Evaluate()?

StackOverflow https://stackoverflow.com/questions/84463

  •  01-07-2019
  •  | 
  •  

Вопрос

Например, я хочу иметь возможность программно вводить строку кода, подобную следующей, где имя функции присваивается динамически без использования функции Evaluate().Приведенный ниже код, конечно, не работает, но представляет то, что я хотел бы сделать.

application.obj[funcName](argumentCollection=params)

Единственный способ, который я могу найти для динамического вызова функции, - это использовать cfinvoke , но, насколько я могу судить, это создает экземпляр соответствующего cfc / функции "на лету" и не может использовать ранее созданный экземпляр cfc.

Спасибо

Это было полезно?

Решение

Согласно документам, вы можете сделать что-то вроде этого:

<!--- 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">

Вы должны иметь возможность просто вызвать его с помощью method="#myMethod#" для динамического вызова определенной функции.

Другие советы

Вы можете использовать cfinvoke .Вам не нужно указывать компонент.

<cfinvoke method="application.#funcName#" argumentCollection="#params#">

Вы также можете сделать что-то очень похожее на то, как вы хотели это использовать.Вы можете получить доступ к методу внутри объекта, используя используемый вами синтаксис, вы просто не можете вызвать его одновременно.Однако, если вы назначите его временной переменной, вы можете затем вызвать его

<!--- 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>

В CFML функции являются первоклассными элементами языка.Это позволяет нам передавать их как переменную.В следующем примере я скопирую функцию с именем 'foobar' и переименую ее в "$fn" внутри того же объекта.Тогда мы можем просто вызвать $fn().

funcName = 'foobar';    
application.obj.$fn = application.obj[funcName];
application.obj.$fn(argumentCollection=arguments);

Контекст функции важен, особенно если она ссылается на какие-либо значения в области "переменные" или "this" объекта.Примечание:это не является потокобезопасным для экземпляров CFC в общих областях!

Самый быстрый способ - воспользоваться рекомендацией Бена Дума.Я просто хотел быть доскональным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top