Grails передает параметры между taglibs и javascripts

#grails #gsp

#grails #gsp

Вопрос:

Я создаю виджет с тегом lib, который зависит от большого количества javascript, загружаемого в браузер. Я записал все это в taglib в виде текста и отправил его с помощью out << , но я думаю, было бы чище, если бы я извлек скрипт и включил его в качестве ресурса. Однако возникли некоторые проблемы с пониманием того, как отделить javascript от кода grails в taglib

Упрощенный пример того, что я пытаюсь сделать — допустим, тег ‘name’, который показывает имя пользователя, но при нажатии он выдает идентификатор пользователя:

В качестве тега я мог бы написать:

 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>
  

Чего я не могу понять, так это как извлечь функцию click из taglib в библиотеку 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:

Один из способов добиться этого — использовать данные Jquery.

Напишите свой тег следующим образом:

 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>  

Комментарии:

1. Это кажется правильной идеей. Я попробую. Спасибо.