В Grails, используя gsp, как создать разделенный запятыми список ссылок из коллекции доменных объектов? - PullRequest
1 голос
/ 13 октября 2011

В основном я хочу:

<g:fancyJoin in="${myList}" var="item" separator=", ">
    <g:link controller="foo" action="bar" id="${item.id}">${item.label}</g:link>
</g:fancyJoin> 

и для

def mylist = [[id:1, label:"first"], [id:2, label:"second"]] 

он должен вывести:

<a href="foo/bar/1">first</a>, <a href="foo/bar/2">second</a>

Ключевая разница между этим и существующимТег объединения - это то, что мне нужно, чтобы он в основном собирал и применял теги к начальному списку перед выполнением операции объединения

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Вы не должны делать это в GSP. Загромождение вашего представления циклами и условными выражениями затрудняет поддержку кода и вынуждает вас тестировать с помощью функциональных тестов, которые довольно медленные. Если вы сделаете это в taglib, вы очистите представление, и тестирование будет очень простым.

2 голосов
/ 23 мая 2014

Вы можете определить пользовательский тег, например:

def eachJoin = {attrs, body ->
    def values = attrs.remove('in')
    def var = attrs.remove('var')
    def status = attrs.remove('status')
    def delimiter = attrs.remove('delimiter')

    values.eachWithIndex {entry, i ->
        out << body([
                (var ?: 'it') : entry,
                (status ?: 'i') : i
        ])

        if(delimiter && (i < values.size() - 1)) {
            out << delimiter
        }
    }
}

Использование:

<g:eachJoin in="${myList}" var="item" delimiter=", ">
    <g:link controller="foo" action="bar" id="${item.id}">${item.label}</g:link>
</g:eachJoin> 
...