Эквивалентен в Coldfusion для функций call () и apply () JavaScript - PullRequest
0 голосов
/ 02 февраля 2012

Мне нужно добиться функциональности, аналогичной функциям JavaScript call () или apply () в Coldfusion 8. Мне нужен способ динамического связывания моего контекста this для вызываемой функции.Кроме ручной передачи контекста в списке аргументов, есть ли другой способ сделать это?К сожалению, мне трудно найти подсказки в Google, потому что я не могу найти ключевое слово "this".

<!--- component A --->
<cfcomponent>
    <cffunction name="init">
        <cfset this.value = "My name is A">
        <cfreturn this>
    </cffunction>

    <cffunction name="setDelegate">
        <cfargument name="delegate">

        <cfset this.delegate = delegate>
    </cffunction>

    <cffunction name="runDelegate">
        <cfoutput>#this.delegate()#</cfoutput>
    </cffunction>
</cfcomponent>

<!--- component B --->
<cfcomponent>
    <cffunction name="init">
        <cfset this.value = "Hello, I am B">
        <cfreturn this>
    </cffunction>

    <cffunction name="call">
        <cfoutput>#this.value#</cfoutput>
    </cffunction>
</cfcomponent>

<!--- main cfm --->
<cfset mrA = createObject('component', 'A').init()>
<cfset mrB = createObject('component', 'B').init()>

<cfset mrA.setDelegate(mrB.call)>

<!--- I want to return "Hello, I am B", --->
<!--- but it's going to output "My name is A" in this case --->
<cfoutput>#mrA.runDelegate()#</cfoutput>

В приведенном выше примере контекст "this" принадлежит A, но я хочу связать контекст с B, чтобы использовать свойства B.

Это легко сделать в JavaScript, просто передав mrB в функцию call (): mrA.runDelegate.call (mrB);который установит контекст «this» в mrB вместо mrA.

Ответы [ 3 ]

1 голос
/ 02 февраля 2012

Если вы пытаетесь динамически вызывать метод из заданного компонента, вам, вероятно, нужно сделать что-то вроде

<cfinvoke component="#this#" method="#methodToCall#">
   <cfinvokeargument name="#prop#" value="#someValue#" />
</cfinvoke>

Это использовало бы все "this" и вызывало бы метод в компоненте, поэтому ваш контекст должен быть неизменным.

Если вы просто вызываете метод в компоненте стандартным способом, тогда «this» доступно, не делая ничего особенного.

Чтобы дать вам лучшее решение, нам нужно знать, чего вы пытаетесь достичь.

0 голосов
/ 03 февраля 2012

Извините, думаю, я понял это. Я должен также передать в контексте вместе с делегатом для вызова. Я вдруг понял, что мне не хватает аргумента, когда я думал о том, как я это сделал в JavaScript.

<!--- Component A --->
<cfcomponent>
    <cffunction name="init"> 
        <cfset this.value = "My name is A">
        <cfreturn this>
    </cffunction>

    <cffunction name="setDelegate">
        <cfargument name="delegate">
        <cfargument name="context">

        <cfset this.delegate = delegate>
        <cfset this.context = context>
    </cffunction>

    <cffunction name="runDelegate">
        <cfoutput>#this.delegate()#</cfoutput>
    </cffunction>
</cfcomponent>

<!--- component B --->
<cfcomponent>
    <cffunction name="init">
        <cfset this.value = "Hello, I am B">
        <cfreturn this>
    </cffunction>

    <cffunction name="call">
        <cfoutput>#this.value#</cfoutput>
    </cffunction>
</cfcomponent>

<!--- main cfm --->
<cfset mrA = createObject('component', 'A').init()>
<cfset mrB = createObject('component', 'B').init()>

<cfset mrA.setDelegate("call", mrB)>

<cfoutput>
    <cfinvoke component="#mrA.context#" method="#mrA.delegate#"></cfinvoke>
</cfoutput>
0 голосов
/ 02 февраля 2012

Я на самом деле не думаю, что это возможно, потому что эта область является общедоступной областью действия экземпляра CFC, заменить контекст этого не так просто.Однако, как подсказал @ rip747, если бы вы были немного более ясны в том, что вы ищете, возможно, есть способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...