从CFC中创建新实例

时间:2012-04-04 08:56:52

标签: coldfusion cfc

现在这似乎是非常直接的事情,但在ColdFusion中似乎并非如此。我需要在var a = new this()内部创建一个CFC实例,但这显然不起作用。不能使用CFC名称,因为它是一个将被扩展的基础,所以我试图通过以下方式解决问题:

component {
    public function subQuery (required string table) {

        var classPath = getMetaData(this).fullname;
        return createObject("component", classPath).init(table, this.dsn);

    }
}

这是可以接受的,但从getMetaData(this).fullname返回的类路径不正确。 CFC位于使用my-folder中的hypen命名的文件夹中,返回的路径看起来像my.-folder.myCFC,并且在连字符之前插入了句点。显然我可以用正则表达式操纵这个字符串,但这不是我想要走的道路。

希望有人采取更清洁的方法,谢谢。

1 个答案:

答案 0 :(得分:4)

理论上,您应该能够在没有任何关于对象名称的上下文的情况下执行此操作,因为它将从内部执行,并且应该检查其当前目录。

因此,以下应该完成您需要的工作

var classPath = ListLast(getMetaData(this).fullname,'.');
return createObject("component", classPath).init(table, this.dsn);

这样,目录名称无关紧要,无论目录结构如何,它都适用于任何扩展该目录的对象,或者是完整的示例

public function cloneMe() {
    return CreateObject('component', ListLast(getMetaData(this).fullname,'.')).init(argumentCollection=arguments);
}

这样传入的任何参数都会传递给init。即扩展CFC可以重新定义方法如下(如果在未提供init参数时需要错误)

public function cloneMe(required string table) {
    return super.cloneMe(table=arguments.table,dsn=this.dsn);
}