Příspěvky se štítkem ‘iterační značka’

Vlastní iterační značka v Grails s pojmenovanou proměnnou

18. 6. 2008 v 23.50

Ukážu Vám, jak vytvořit iterační značku v Grails, která může obsahovat jinou značku. Vnitřní značka pak použije proměnnou z iterační značky. Vytvoříme si tedy například značku, která vytvoří x odkazů ve tvaru „/show/1“, „/show/2“, atd. s popisem „Příspěvek číslo 1“, „Příspěvek číslo 2“ atd.:

Pro začátek existuje pěkný a šikovný příklad jednoduché iterační značky na stránkách Grails.

Definice:

def repeat = { attrs, body ->
  def i = Integer.valueOf( attrs["times"] )
  def current = 0
  i.times {
    // predej cislo aktualni iterace standardnim argumentem groovy nazvanym "it"
    // a vysledek pote predej do "out", odkud se vypise do pohledu
    out << body( ++current )
  }
}

Příklad použití:

<g:repeat times="3">
  <p>Opakuj 3-krát! Toto je opakování č. ${it}</p>
</g:repeat>

Jednoduchá úprava značky nevede k požadovanému chování:

<g:repeat times="3"> 
  <g:link action="show" id="${it}">Ahoj číslo  ${it}</g:link> 
</g:repeat>

Takto se vygeneruje jenom třikrát řetězec „Ahoj číslo “, protože proměnná „it“ je tu neznámá.
Je proto zapotřebí upravit definici značky. Přidejme další parametr „var“ jako symbolické jméno aktuálního člena kolekce pro danou iteraci.

def repeat = { attrs, body -> 
  def pars = [:]
 
  attrs.times?.toInteger().times { n -> 
    pars[attrs.var] = n
    out << body(pars) 
  } 
}

Teď můžeme použít značku g:link i uvnitř naší nové značky:

<g:repeat times="3" var="num"> 
  <g:link action="show" id="${num}">Ahoj číslo ${num}</g:link> 
</g:repeat>

Nejsem si jistý, zda je toto chování podporované, ale v každém případě funguje.