我需要在Coldfusion 8中实现与JavaScript的call()或apply()函数类似的功能。我需要一种方法来动态绑定我调用的函数的'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的属性。
通过简单地将mrB传入call()函数,在JavaScript中很容易做到: mrA.runDelegate.call(MRB);这会将'this'上下文设置为mrB而不是mrA。
答案 0 :(得分:1)
假设您尝试从给定组件中动态调用方法,则可能需要执行类似
的操作<cfinvoke component="#this#" method="#methodToCall#">
<cfinvokeargument name="#prop#" value="#someValue#" />
</cfinvoke>
那将使用整个“this”并调用组件中的方法,因此您的上下文应该完好无损。
如果您只是以标准方式调用组件中的方法,则可以使用“this”而不做任何特殊操作。
为了给你一个更好的解决方案,我们需要知道你想要达到的目标。
答案 1 :(得分:0)
我实际上并不认为这是可能的,因为此范围是CFC实例的公共范围,替换此上下文并非易事。但是,正如@ rip747建议的那样,如果你对自己的目标更加清楚,也许有办法可以做到。
答案 2 :(得分:0)
对不起,我想我已经明白了。我也应该和代表一起传递上下文来打电话。当我想到我是如何用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>