Grails在taglib和javascripts之间传递参数

时间:2016-10-22 01:09:02

标签: grails gsp

我正在创建一个带有标签lib的小部件,这取决于很多javascript被推送到浏览器。我把它写在taglib中作为文本,然后用out<< ,但我认为如果我删除脚本并将其作为资产包含它会更清晰。但是,在确定如何将javascript与taglib中的grails代码分开时遇到一些麻烦

我想要做的简化示例 - 让我们说一个名字'显示用户名的标记,但是当您单击它时会提醒用户Id:

作为标签我可以写:

class FooTagLib {
    static encodeAsForTags = [tagName: [taglib:'html'], otherTagName: [taglib:'none']]
    static namespace = 'foo'
    def name = {attrs, body ->
        out << "<p id = ${attrs.uid}>${attrs.username}</p>"
        out << "<script type='text/javascript'>"
        out << """
\$('#{$attrs.uid}.click( function() {
alert("ID for user ${attrs.username} is ${attrs.uid}); });
"""
    }
}

然后在我的gsp中我可以写:a

<foo:name username="${user.name}" uid="${user.id}"></foo:name>

我能弄清楚的是如何将taglib中的click函数提取到javascript库中,因此我可以将FooTagLib转换为:我如何传递attrs.username和attrs.uid所以它是可以在javascript文件中访问吗?

 class FooTagLib {
        static encodeAsForTags = [tagName: [taglib:'html'], otherTagName: [taglib:'none']]
        static namespace = 'foo'
        def name = {attrs, body ->
            out << "<p id = ${attrs.uid}>${attrs.username}</p>"
            out << "<asset:  type='text/javascript'>"
            out << "<asset:javascript src='footag.js'/>
         }
    }

1 个答案:

答案 0 :(得分:2)

我实现这一目标的一种方法是使用Jquery data

像这样写下你的标签:

out << "<p id='my-p-with-data' data-id='${attrs.uid}' data-name='${attrs.username}'>${attrs.username}</p>"

您呈现的HTML是:

<p id='my-p-with-data' data-id='5' data-name='John Doe'>John Doe</p>

然后,你需要使用JS:

alert("ID for user "+$('#my-p-with-data').data( 'name' ) + " is " + $('#my-p-with-data').data( 'id' ))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id='my-p-with-data' data-id='5' data-name='John Doe'>John Doe</p>