1

我有自己的 Grails 插件,我在其中使用 doWithDynamicMethods 闭包添加了一个动态方法:

def doWithDynamicMethods = {ctx ->
    ['controller'].each {
         application."${it}Classes".each { theClass ->
         theClass.metaClass.myMethod = { ... }
    }
}

当我从控制器调用此方法时,它工作正常:

...
myMethod()
...

但是当我从脚手架模板调用它时,它找不到这个方法:

...
def save() {
    <%= "myMethod()" %>
}
...

有什么方法可以让它工作吗?或者我是否需要为脚手架模板的动态方法使用其他模式?

感谢您的任何提示:]

4

1 回答 1

3

脚手架模板不会引用您所引用的实际控制器scaffold true。您必须抓住实际的控制器才能使用动态方法。

这可以通过grails.util.GrailsWebUtil以下方式完成,如下所示:

...
def save() {
    def actualController = GrailsWebUtil.getControllerFromRequest(request)
    actualController.myMethod() 
}
...

当控制器(人工制品)被搭建时,实际控制器的副本在运行时用于搭建。对主控制器的所有调用都由副本处理。为了使用动态方法,您需要实际控制器的句柄,因为动态方法是根据实际控制器工件创建的。

于 2013-08-13T01:48:26.840 回答