0

私は(とりわけ)リソースの包含をトリガーするGrailsカスタムタグを書き込もうとしているので<myTags:view name="foo"/>、たとえば、のようなものがロードされますjs/views/foo.js。そして、私はそれをロードしたいですdisposition: 'head'

を使用することはできます<r:external/>が、それはに入れません。インラインタグ<head>を生成するだけです。<script/>を使用することもできます<r.script/>が、パスを参照することはできません。カスタムタグにファイルを読み取らせて、にダンプする必要がありoutます。

さて、もしfoo.jsそれ自身のモジュールなら、私は次のようなことをすることができました:r.require([module: 'foo'])、しかしそうではありません; これのポイントの一部は、これらのファイルのすべてをで宣言する必要がないということですApplicationResources.groovyApplicationResources.groovyしかし、利用可能なファイルを読み取ることで、プログラムでモジュールを作成できたかもしれません-それは可能ですか?それとももっと良い方法はありますか?

4

1 に答える 1

0

結局、ApplicationResources.groovyプログラムでモジュールを作成する方向に進んだので、カスタムタグでを使用できます<r:require/>

アイデアは、バックボーンビューごとに、ファイル内web-app/myApp/viewsにバックボーンビューがあり、.jsファイル内にハンドルバーテンプレートがあり.handlebarsます(慣例により同じ名前です)。ファイルは通常のモジュールとして宣言され.handlebarsますが、Handlebars-Resourcesプラグインによってプリコンパイルされます。

の一部のコードは、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'

        }
    }
}

次に、taglib:

class ViewsTagLib {
    static namespace = "myApp"

    def view = { attrs ->
        r.require(module: "${attrs.name}View")
        out << "<${attrs.tagName} id='${attrs.id}'></${attrs.tagName}>"
    }
}

GSPで呼び出す:

<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>

きれいではありませんが、混乱はほとんど隠されており、定型文や複数のファイルにマジックストリングを追加するのを忘れる機会を大幅に減らす必要があります。

于 2013-01-17T19:35:41.007 に答える