Modelos Nunjucks
Este é um guia de referência para o mecanismo de modelo AdonisJs, cobrindo tópicos sobre tags, filtros e métodos disponíveis para serem usados dentro de suas visualizações. Leia o guia de visualizações para entender como as visualizações funcionam no AdonisJs.
Tags
Tags são blocos que definem operações lógicas dentro de suas visualizações. Abaixo está a lista de tags disponíveis e seus usos.
if
{% if username %}
{{username}}
{% endif %}
{% if not currentUser %}
<p> You're not logged in! </p>
{% endif %}
Você também pode realizar a comparação via ==
.
{% if age == 18 %}
You are allowed to join
{% endif %}
else
, elif
{% if hungry %}
I am hungry
{% elif tired %}
I am tired
{% else %}
I am good!
{% endif %}
If
como uma expressão
{{ 'Party' if weekend else 'Do some work' }}
for/asyncEach
O loop for
itera sobre matrizes e objetos.
<!-- Array -->
{% for item in items %}
{{ item.text }}
{% endfor %}
<!-- Object -->
{#
var scores = {
Maths: 88,
English: 92,
Science: 94
}
#}
{% for subject, score in scores %}
You scored {{ score }} in {{ subject }}
{% endfor %}
asyncAll
A tag asyncAll
executará um loop assíncrono em paralelo. É útil quando você executa uma operação assíncrona dentro de um loop.
OBSERVAÇÃO
Abaixo está um exemplo de busca de perfil de usuário dentro de um loop, o que causará várias consultas ao banco de dados. É recomendado eagerLoad relacionamentos usando Lucid.
<ul>
{% asyncAll user in users.toJSON() %}
<li>{{ user.id | fetchProfile }}</li>
{% endall %}
</ul>
set
set
cria uma variável temporária dentro de suas visualizações. Pense nisso como var
dentro do Javascript.
{% set username = "John" %}
{{ username }}
Além disso, você pode definir várias chaves e seus valores de uma vez.
{% set x, y, z = 5 %}
yield
Execute um ES2015 Generator ou uma Promise dentro de suas visualizações.
{% yield users = User.all() %}
{{ users | json }}
raw
Ao criar aplicativos web agnósticos de Front-End, você provavelmente usará VueJs, AngularJs ou qualquer estrutura semelhante. Para impedir que suas visualizações analisem seus modelos de front-end, você deve usar a tag raw
.
{% raw %}
<p>{{ message }}</p>
<input v-model="message">
{% endraw %}
filter
Em vez de usar filtros com um símbolo pipe (|), você também pode usar filtros como uma tag.
{% filter title %}
may the force be with you
{% endfilter %}
<!-- Saída -->
May The Force Be With You
call/caller
Uma call
facilita a passagem de muitas marcações para suas macros. Uma macro pode acessar o conteúdo passado como caller
.
<!-- resources/views/macros/modal.nunjucks -->
{% macro modal(effect='fade') %}
<div class="modal {{ effect }}">
<div class="modal-dialog">
{{ caller() }}
</div>
</div>
{% endmacro %}
Agora vamos usar a macro modal.
<!-- resources/views/home.nunjucks -->
{% from 'macros.modal' import modal %}
{% call modal() %}
<div class="modal-header"></div>
<div class="modal-body"></div>
<div class="modal-footer"></div>
{% endcall %}
<!-- Saída -->
<div class="modal fade">
<div class="modal-dialog">
<div class="modal-header"></div>
<div class="modal-body"></div>
<div class="modal-footer"></div>
</div>
</div>
Comentários
{# This is a comment #}
Controle de Espaço em Branco
O mecanismo de modelo renderizará todos os espaços em branco entre suas tags. Use a seguinte maneira se quiser remover todo o branco entre o início e o fim da tag.
{% for i in [1,2,3,4,5] -%}
{{ i }}
{%- endfor %}
O símbolo -
define a direção do controle de espaço em branco. Colocá-lo na esquerda cortará o espaço em branco da esquerda e defini-lo para a direita terá o efeito desejado.
Expressões
Todas as expressões fornecidas são suportadas.
Strings:
"How are you?", 'How are you?'
Numbers:
40, 30.123
Arrays:
[1, 2, "array"]
Objects:
{username: 'John', age: 28}
Boolean:
true, false
Operadores Matemáticos
Abaixo está a lista de operadores matemáticos suportados.
- Adição:
+
- Subtração:
-
- Divisão:
/
- Divisão e truncamento de inteiro:
//
- Resto da divisão:
%
- Multiplicação:
*
- Potência:
**
<!-- Usage -->
{{ 10 + 2 }} {# 12 #}
{{ 10 / 2 }} {# 5 #}
{{ 10 % 2 }} {# 0 #}
Operadores de Comparação
Abaixo está a lista de operadores de comparação suportados.
- Igual a
==
- Diferente de
!=
- Maior que
>
- Maior que igual a
>=
- Menor que
<
- Menor que igual a
<=
<!-- Uso -->
{% if numUsers < 5 %}...{% endif %}
{% if i == 0 %}...{% endif %}
Operadores Lógicos
Abaixo está a lista de operadores lógicos suportados.
and
{% if isLimit and count > limit %}
You have crossed the limit of {{ limit }} users.
{% endif %}
or
{% if isAdmin or hasPermission %}
Welcome!
{% endif %}
not
{% if not isAdmin %}
You are not allowed to access this record.
{% endif %}
DICA
Use parênteses para agrupar expressões. if (x < 5 or y < 5) and foo
Auto Escape
Todos os valores são auto escaped dentro de suas visualizações para mantê-los seguros contra injeção de HTML e ataques XSS. No entanto, seu aplicativo pode ter requisitos de injeção de snippets HTML dentro de suas visualizações e, nesse caso, você deve usar o filtro safe
.
<!-- Sem filtro -->
{% set title = '<h1> Title </h1>' %}
{{ title }}
{# output <h1> Title </h1> #}
<!-- Com filtro -->
{% set title = '<h1> Title </h1>' %}
{{ title | safe }}
{# output <h1> Title </h1> #}
Globais
Aqui falamos sobre globais predefinidos registrados pelo framework. Confira link:views#_working_with_globals[Trabalhando com globais] para saber mais sobre como definir globais de visualizações personalizadas.
linkTo(route, text, data, target)
Retorna link para uma rota registrada
// Rota
Route
.get('/users', 'UserController.index')
.as('listUsers')
<!-- View -->
{{ linkTo('listUsers', 'View All Users') }}
{{ linkTo('listUsers', 'View All Users', {}, '_blank') }}
<!-- Saída -->
<a href="/users"> View Profile </a>
<a href="/users" target="_blank"> View Profile </a>
linkToAction(controllerAction, text, data, target)
Retorna link para ação do controlador de rota registrada.
{{ linkToAction('UserController.index', 'View All Users') }}
{{ linkToAction('UserController.index', 'View All Users', {}, '_blank') }}
<!-- Saída -->
<a href="/users"> View Profile </a>
<a href="/users" target="_blank"> View Profile </a>
range(start, stop, [step=1])
Faz um loop em um intervalo de valores. Pense nisso como chamar um loop for
.
{% for i in range(0, 5) -%}
{{ i }},
{%- endfor %}
// Saída
0,1,2,3,4
Filtros
Abaixo está a lista de todos os filtros disponíveis. Confira link:views#_working_with_filters[Trabalhando com filtros] para saber mais sobre como definir filtros.
age
{{ age | abs }}
action
Retorna URL para ação do controlador registrado.
// Rota
Route.put('/user/:id', 'UserController.update')
<!-- View -->
<form method="POST" action="{{ 'UserController.update' | action({id: 1}) }}">
</form>
<!-- Saída -->
<form method="POST" action="/user/1"></form>
batch
Cria vários pedaços de uma matriz. É útil ao imprimir grade HTML.
{% for rows in users | batch(3) %}
<div class='row'>
{% for user in rows %}
<div class='col-md-4'></div>
{% endfor %}
</div>
{% endfor %}
capitalize
{{ name | capitalize }}
default
{{ title | default('Adonis') }}
first
Retorna o primeiro item de uma matriz.
{{ ['foo','bar'] | first }}
groupby
{% set users = [{username:'doe', age:22}, {username:'dim', age:22}, {username:'dock', age:21}] %}
{{ users | groupby('age') | json }}
indent(width=2, firstLine=false)
Recua cada linha da string com os espaços fornecidos.
{{ text | indent(2, true) }}
join
{{ ['hello', 'world'] | join(' ') }}
json(indentation=2)
{{ users | json }}
{{ users | json(4) }}
last
Retorna o último item de uma matriz.
{{ ['foo','bar'] | last }}
length
Retorna o comprimento do array.
{{ ['foo','bar'] | length }}
list
Converte um array em uma lista, pense nisso como uma substituição para join
, mas também funciona com strings dentro do array.
{{ ['foo','bar'] | list }}
lower
Converte valor para minúsculas
{{ "Hello World" | lower }}
{# hello world #}
random
Retorna item aleatório de um array
{{ ['foo', 'bar', 'baz'] | random }}
rejectattr
Filtra um array e remove objetos contendo atributos definidos
{% set users = [{username: 'doe', admin: false}, {username: 'doe', admin: true}] %}
{{ users | rejectattr('admin') | json }}
replace
Implementação do método nativo replace
do javascript, o primeiro argumento pode ser um regex.
{{ 'Hello World' | replace('World', 'Everyone') }}
{# Hello Everyone #}
reverse
{{ 'Hello World' | reverse }}
round
Arredonda o número para uma precisão dada usando o método definido
{{ 42.55 | round }}
{# 43.0 #}
{{ 42.55 | round(1, 'floor') }}
{# 42.5 #}
route
Resolve uma rota registrada.
// Rota
Route
.put('/profile/:id', 'ProfileController.update')
.as('updateProfile')
<form method="POST" action="{{ 'updateProfile' | route({id: 1}) }}">
</form>
striptags
Remove as tags Html, XML de uma string
{{ '<h2> Hello World </h2>' | striptags }}
{# Hello World #}
title
{{ "hello world" | title }}
{# Hello World #}
trim
Corta o espaço em branco.
{{ " Hello World " | trim }}
{# Hello World #}
truncate
Retorna uma cópia truncada da string.
{{ "Grumpy wizards make toxic brew for the evil Queen and Jack." | truncate(30) }}
{# Grumpy wizards make toxic brew... #}
upper
Torna a string em maiúsculas.
{{ 'hello world' | upper }}
urlencode
Torna o valor amigável para URL (usa codificação UTF-8).
{{ 'http://foo.com?bar=baz' | urlencode }}
wordcount
Conta palavras em uma string.
{{ 'Grumpy wizards make toxic brew' | wordcount }}
float
Converte o valor em um valor float.
{{ '1.2' | float }}
int
Converte o valor em um valor inteiro.
{{ '1.2' | int }}