从Grails自定义标记加载静态资源,配置:';头部';

从Grails自定义标记加载静态资源,配置:';头部';,grails,grails-2.0,custom-tags,Grails,Grails 2.0,Custom Tags,我正在尝试编写一个Grails自定义标记,它(除其他外)会触发资源的包含,因此像这样的东西会加载,比如说,js/views/foo.js。我想让它加载配置:'head' 我可以使用,但这不会将其放入中,它只会生成一个内联标记。我可以使用,但这不允许我引用路径;我必须让我的自定义标记读取文件并将其转储到out 现在,如果foo.js是它自己的模块,我可以做如下事情:r.require([module:'foo']),但它不是;部分原因是我不想在ApplicationResources.groovy

我正在尝试编写一个Grails自定义标记,它(除其他外)会触发资源的包含,因此像
这样的东西会加载,比如说,
js/views/foo.js
。我想让它加载
配置:'head'

我可以使用
,但这不会将其放入
中,它只会生成一个内联
标记。我可以使用
,但这不允许我引用路径;我必须让我的自定义标记读取文件并将其转储到
out


现在,如果
foo.js
是它自己的模块,我可以做如下事情:
r.require([module:'foo'])
,但它不是;部分原因是我不想在
ApplicationResources.groovy
中声明所有这些文件。但是,也许我可以通过读取可用文件,以编程方式创建模块,这是可能的吗?还是有更好的方法?

我最终选择了使用
应用程序资源。groovy
以编程方式创建模块,这样自定义标记就可以使用

其思想是,对于每个主干视图,在
web app/myApp/views
下,在
.js
文件中有一个主干视图,在
.handlebar
文件中有一个把手模板(按照惯例,名称相同)。
.handlebar
文件声明为普通模块,但由handlebar资源插件预编译

ApplicationResources.groovy中的一些代码查找所有视图并创建相应的资源模块:

GrailsApplication grailsApplication = Holders.getGrailsApplication()
File viewsDir = grailsApplication.parentContext.getResource("myApp/views").file;
if (viewsDir.exists() && viewsDir.isDirectory() && viewsDir.canRead()) {
    String[] viewsJS = viewsDir.list().findAll { name -> 
        name.endsWith("View.js") 
    }
    String[] views = viewsJS.collect { name ->
        name.substring(0, name.length() - ".js".length())
    }

    for (view in views) {
        "${view}" {
            dependsOn 'backbone', 'backbone_relational', 'handlebars'
            resource url: "dpg/views/${view}.handlebars", 
                     attrs: [type: 'js'], 
                     disposition: 'head'
            resource url: "dpg/views/${view}.js", 
                     disposition: 'head'

        }
    }
}
然后标记库:

class ViewsTagLib {
    static namespace = "myApp"

    def view = { attrs ->
        r.require(module: "${attrs.name}View")
        out << "<${attrs.tagName} id='${attrs.id}'></${attrs.tagName}>"
    }
}
classviewstaglib{
静态名称空间=“myApp”
def视图={attrs->
r、 require(模块:“${attrs.name}视图”)
出来

真正的重点是创建模块,并将它们包含在需要它们的页面中。我知道您正在尝试做什么,但我认为它在实践中不会起作用。如果您多次使用标记,则可能会多次加载该文件。如果您遵循Grails约定,您会过得更好。根据经验,如果我让开发人员记住,每次他们创建一个视图,在ApplicationResources.groovy中创建一个模块条目,每次他们使用一个视图来确保有一个标记时,他们都会忘记,我们会一遍又一遍地遇到同样的问题。我不想违反DRY。嗯,看起来实际上应该把它放在头上,但是据我所知,它没有任何作用。
<myApp:view tagName="div" name="foo" id="foo1"/>
<myApp:view tagName="div" name="foo" id="foo2"/>
<html>
    <head>
        ...
        <!--
            Automagically generated modules (included only once).
            Should put these in the same bundle, but handlebars-resources
            gets confused.
        -->
        <script src="/myApp/static/bundle-bundle_fooView_handlebars.js" 
                type="text/javascript" ></script>
        <script src="/myApp/static/bundle-bundle_fooView_head.js" 
                type="text/javascript" ></script>
    </head>
    <body>
        ...
        <div id="foo1"></div> <!-- backbone placeholder for 1st view instance-->
        <div id="foo2"></div> <!-- backbone placeholder for 2nd view instance-->
    </body>
</html>