1

我正在尝试将 @GrailsCompileStatic 应用于 taglib 并收到以下错误:

错误:(19, 16) Groovyc: [静态类型检查] - 找不到匹配的方法 com.tempvs.image.MyTagLib#render(java.util.LinkedHashMap)。请检查声明的类型是否正确以及方法是否存在。

代码示例:

@GrailsCompileStatic
class MyTagLib {
    ...
    String myTag = { Map attrs ->
        ...
        out << render(template: '/templates/myTemplate', model: [...])
    }
}

我做错了什么,我该如何解决这个问题?

4

2 回答 2

3

您正在使用一些动态功能,因为标签库通常会使用它们。即使只是调用“渲染”在某种意义上也是动态的。

如果您真的想要,您可以通过注入 PageRenderer 并使用它来呈现您的页面,然后输出生成的 HTML 来解决此问题。我不确定这是否值得,但我当然不知道您的性能要求!

例子:

import grails.compiler.GrailsCompileStatic
import grails.gsp.PageRenderer

@GrailsCompileStatic
class StaticTestTagLib {

    static namespace = "staticTest"

    PageRenderer groovyPageRenderer

    String myTag = { Map attrs ->
        out << groovyPageRenderer.render(template: '/templates/myTemplate', model: [...])

    }
}

这行得通,但是如果您的 taglib 正在做任何远程复杂的事情,您将有一些工作要做,因为每个渲染调用或任何其他标记都必须被静态编译的调用替换。这是可能的,但可能不会有很大的好处。

于 2017-07-11T15:53:53.477 回答
0

我不确定创建一个只呈现模板的新标签有什么意义。

Grails 已经有一个呈现模板的标签库。

   <g:render template="displaybook" model="['book':book,'author':author]" />

https://docs.grails.org/latest/ref/Tags/render.html

于 2017-07-11T21:41:52.943 回答