2016-10-22 20 views
1

我使用标记库创建了一个窗口小部件,这取决于很多JavaScript被推送到浏览器。我把它全部写在taglib中作为文本,并且用< <推出,但我认为如果我将脚本取出并将其作为资产包含在内,它会更干净。然而,在解决如何从taglib中的grails代码中分离javascript时遇到一些问题 - 可以说一个显示用户名的“name”标记,但是当您点击它就会提醒用户编号:在taglibs和javascript之间传递参数的Grails

作为一个标签,我可以写:

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我可以只写:一个

<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'/> 
     } 
    } 

回答

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>

+0

这似乎是正确的想法。我会试一试。谢谢。 – user1023110