Play Framework - Custom tags

21 views
Skip to first unread message

Marcos Vinícius

unread,
Aug 20, 2015, 4:51:14 PM8/20/15
to scal...@googlegroups.com
Pessoal,

preciso criar tags no Play Framework, e minha ideia é utilizar algo semelhante a
JSP Tags:

<minhaTag attrA="valor A" attrB="${OUTRO_OBJETO}"></minhaTag>


Considerando parâmetros que não são obrigatórios.

O mais próximo que consegui foi algo do tipo ( myTag.scala.html ) :

@(args: (Symbol,Any)*)


@attrA = @{ args.toMap.get('attrA) }

@attrB = @{ args.toMap.get('attrB) }


<a href="@attrA">@attrB.algumMetodo()</a>


E para utilizar a tag:

@minhaTag('attrA -> "valor A", 'attrB -> OUTRO_OBJETO)


O problema é que não consigo fazer cast de attrB para outra classe e chamar algumMetodo(), e particularmente não gosto da forma que tenho que declarar os parâmetros da tag. 

Outra opção seria declarar explicitamente os tipos dos parâmetros:

@(attrA: String, attrB: pacote.OutroObjeto)

Mas se atrrA não for obrigatório, teria que passar algo do tipo:

@minhaTag(null, OUTRO_OBJETO)


Conhecem alguma forma mais fácil / elegante ?

--
Atenciosamente, Marcos Vinícius.

@viniciusma

Marcelo Emanoel Bezerra Diniz

unread,
Aug 21, 2015, 8:30:59 AM8/21/15
to scala-br
Olá, 

Uma view no play é traduzido em uma chamada de método. Quando você declara sua tag como myTag.scala.html ela é uma chamada de método.

Num método "normal" como você passaria esses parâmetros?

Sugestão: Se um parâmetro é opcional, utilize Option[Tipo]. Evite nulls a todo custo. Você também pode fazer com que a view/método tenha parâmetros default.
Exemplo:

//myTag.scala.html
@(url: Option[String] = Some("#"), attrB: Option[Int] = Nil) {
   @url.map { link =>
    <a href="@link">@{attrB.getOrElse(0)}</a>
  }
}

e a chamada pode ser algo como:

@myTag()
@myTag(url = Some("https..."))
@myTag(url = Nil, attrB = Some(10))

Marcos Vinícius

unread,
Aug 29, 2015, 5:46:54 PM8/29/15
to scal...@googlegroups.com
Fala, Marcelão!

Só quis exemplificar, estou ciente dos males do maldito null :D

Sua sugestão foi a melhor alternativa mesmo. Valeu ;)



--

---
Você recebeu essa mensagem porque está inscrito no grupo "scala-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para scala-br+u...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages