更新:似乎根本没有这个问题。
更新:我投票结束这个问题,因为我觉得人们总体上更关注“有人有更好的想法拆分大型组件”这个问题的一部分(我不应该把这个问题放进去),然后才是用cfcomponent使用cfincludes的真正问题。
注意:这只是一个简单的例子,说明了我正试图做些什么来让人们了解这个想法。
我遇到的问题是,我希望在cfcomponent中使用cfinclude,这样我就可以将类似的方法分组到单独的文件中,以获得更多的可管理性。我遇到的问题是,当我试图扩展另一个组件时,它也使用cfinclude来管理它的方法,如下所示。注意,ComponentA扩展了ComponentB:
ComponentA
==========
<cfcomponent output="false" extends="componentb">
<cfinclude template="componenta/methods.cfm">
</cfcomponent>
componenta/methods.cfm
======================
<cffunction name="a"><cfreturn "componenta-a"></cffunction>
<cffunction name="b"><cfreturn "componenta-b"></cffunction>
<cffunction name="c"><cfreturn "componenta-c"></cffunction>
<cffunction name="d"><cfreturn super.a()></cffunction>
ComponentB
==========
<cfcomponent output="false">
<cfinclude template="componentb/methods.cfm">
</cfcomponent>
componentb/methods.cfm
======================
<cffunction name="a"><cfreturn "componentb-a"></cffunction>
<cffunction name="b"><cfreturn "componentb-b"></cffunction>
<cffunction name="c"><cfreturn "componentb-c"></cffunction>问题是,当我尝试初始化ComponentA时,我得到了一个错误:“例程不能被声明不止一次。例程a在不同的模板中被声明了两次”。
之所以出现这种情况,是因为当您使用cfinclude时,它是在运行时而不是在编译时进行评估的。
如果不将方法移动到组件本身并消除cfinclude的使用,我如何才能绕过这个问题,或者有人对拆分大型组件有更好的想法呢?
发布于 2010-06-12 21:17:05
我的建议是:重新分析对象,尝试应用于所有OOP规则和最佳实践(抽象、封装、模块化、多态、继承、DRY等)。
因此,基本上您希望组件B有方法isCrunchable(),然后组件A扩展B,isCrunchable()可以从继承中获得。A和B都会返回不同的状态,所以我看不出有什么问题。如果您在“上面”创建了一个类,使所有方法和组件A和B都扩展了该类,那么您就可以得到“大型组件”的解决方案,但是,我还是会尝试更多地处理这个问题。
如果这个答案没有帮助,你可以张贴真实的例子,也许我们会更好地了解你为什么要这样做。
发布于 2010-06-13 03:22:34
没有经过测试,但我会尝试将每个函数的内容包含在一个包含中,但是定义组件文件本身中的函数。`
<cfcomponent name="a">
<cffunction name="aa">
<cfinclude template="componenta/functiona.cfm" />
</cffunction>
</cfcomponent>祝好运。
发布于 2010-06-12 22:49:46
我同意扎尔科的说法,你应该重新安排你的目标,但如果你必须.
在CF5中,我使用了将函数放入请求范围的技巧。这可以通过将函数名分配给同名的请求变量(即用于名为getLatestUpdate的函数)来实现:
Request.getLatestUpdate = getLatestUpdate然后,在包含带有函数的文件之前,对请求范围中的变量进行切赫操作。如果请求作用域变量不存在,则只有cfinclude函数文件。
缺点是您需要引用带有请求范围前缀的函数,而且这只会在传统的页面请求隐喻中起作用,它很可能会中断诸如远程处理调用之类的事情。
我还没测试过这个和YMMV。
https://stackoverflow.com/questions/3030056
复制相似问题