forked from DiscoverMeteor/DiscoverMeteor_Pt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path03-templates.md.erb
231 lines (157 loc) · 6.48 KB
/
03-templates.md.erb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
---
title: Templates
slug: templates
date: 0003/01/01
number: 3
contents: Aprenda sobre a linguagem de templating do Meteor, a Handlebars.|Crie seus primeiros três templates.|Aprenda como os gerenciadores Meteor funcionam.|Tenha um protótipo básico funcionando com dados estáticos.
paragraphs: 46
---
Para facilitar o desenvolvimento em Meteor, nós adotaremos uma abordagem de fora para dentro. Em outras palavras, nós iremos constuir uma casca externa "burra" com HTML/JavaScript primeiro, e então associar com o funcionamento interno de nosso aplicativo no subsequentes trabalhos.
Isto significa que neste capítulo nós apenas nos preocuparemos com o que está acontecendo dentro do diretório /client.
Vamos criar um novo arquivo chamado main.html dentro de nosso diretório /client, e vamos preenchê-lo com o seguinte código:
~~~html
<head>
<title>Microscope</title>
</head>
<body>
<div class="container">
<header class="navbar">
<div class="navbar-inner">
<a class="brand" href="/">Microscope</a>
</div>
</header>
<div id="main" class="row-fluid">
{{> postsList}}
</div>
</div>
</body>
~~~
<%= caption "client/main.html" %>
Este será nosso principal template do aplicativo. Como você pode ver é HTML puro exceto por uma única tag `{{> postsList}}```, a qual é um ponto de inserção para o template postList como logo veremos. Por enquanto, vamos criar mais alguns templates.
### Meteor Templates
No seu âmago, um site de notícias sociais é composto de postagens organizadas em listas, e é exatamente assim que iremos organizar nossos templates.
Vamos criar um diretório `/views` dentro de `/client`. Isto irá ser onde nós colocaremos nossos templates, e para manter as coisas organizadas nós também criaremos `/posts` dentro de `/views` apenas para nossos templates relacionados com postagens.
<% note do %>
### Finding Files
O Meteor é incrível para encontrar arquivos. Não importa onde você colocou o seu código no diretório `/client`, o Meteor irá encontrá-lo e compilá-lo corretamente. Isto significa que você nunca precisará manualmente escrever caminhos para inclusão de arquivos JavaScript ou CSS.
Isto também significa que você poderia muito bem colocar todos os seus arquivos no mesmo diretório, ou ainda todo o seu código em um mesmo arquivo. Mas desde que o Meteor vai compilar tudo em um único arquivo minificado de qualquer forma, é melhor que mantemos as coisas bem organizadas e utilize uma estrutura clara de arquivos.
<% end %>
Nós finalmente estamos prontos para nosso segundo template. Dentro de `client/views/posts`, crie `posts_list.html`:
~~~html
<template name="postsList">
<div class="posts">
{{#each posts}}
{{> postItem}}
{{/each}}
</div>
</template>
~~~
<%= caption "client/views/posts/posts_list.html" %>
E `post_item.html`:
~~~html
<template name="postItem">
<div class="post">
<div class="post-content">
<h3><a href="{{url}}">{{title}}</a><span>{{domain}}</span></h3>
</div>
</div>
</template>
~~~
<%= caption "client/views/posts/post_item.html" %>
Note o atributo `name="postList"` do elemento template. Este é o norme que será utilizado pelo Meteor para acompanhar qual template vai aonde.
É hora de introduzir o sistema de templating do Meteor, o [ Handlebars](http://handlebarsjs.com). Handlebars é simplesmente HTML, com a adição de três coisas: parciais (*partials*), expressões (*expressions*) e blocos de ajuda (*block helpers*).
As *parciais* usam a síntaxe `{{> templateName}}`, e simplemente dizem ao Meteor para substituir a parcial com o template de mesmo nome (no nosso caso `postItem`).
*Expressões* tais como `{{title}}` ou chamam a propriedade do objeto atual, ou retornam o valor de um auxiliar do template como definido no gerenciador atual do template (logo mais sobre isso).
Finalmente, *blocos de ajuda* são tags especiais que controlam o fluxo do template tais como `{{#each}}...{{\each}}` ou `{{#if}}...{{\if}}`.
<% note do %>
### Indo Além
Você pode visitar o [site oficial de Handlebars](http://handlebarsjs.com) ou [este prático tutorial](http://javascriptissexy.com/handlebars-js-tutorial-learn-everything-about-handlebars-js-javascript-templating/) se quiser aprender mais sobre Handlebars.
<% end %>
Armado com este conhecimento, nós podemos facilmente entender o que está acontecendo aqui.
Primeiro, no template `postsList`, nós estamos iterando sobre um objeto `posts` com o bloco de ajuda `{{#each}}...{{\each}}`. Então, para cada iteração nós incluimos o template `postItem`.
De onde este objeto `posts` se origina? Boa pergunta. Se trata na verdade de um ajudante do template, e nós iremos defini-lo quando olharmos para os gerenciadores de template.
O template `postItem` em si mesmo é bem direto. Apenas usa três expressões: `{{url}}` e {{title}} ambas retornando as propriedades do documento, e `{{domain}}` que chama um ajudante do template.
Nós mencionamos "ajudantes do template" bastante ao longo deste capítulo sem realmente explicar o que eles fazem. Mas para consertar isso, primeiro precisamos falar sobre gerentes.
### Gerentes de Template
////
////
////
<% note do %>
### Managers?
////
////
////
<% end %>
////
~~~js
var postsData = [
{
title: 'Introducing Telescope',
author: 'Sacha Greif',
url: 'http://sachagreif.com/introducing-telescope/'
},
{
title: 'Meteor',
author: 'Tom Coleman',
url: 'http://meteor.com'
},
{
title: 'The Meteor Book',
author: 'Tom Coleman',
url: 'http://themeteorbook.com'
}
];
Template.postsList.helpers({
posts: postsData
});
~~~
<%= caption "client/views/posts/posts_list.js" %>
////
<%= screenshot "3-1", "Our first templates with static data" %>
<%= commit "3-1", "Added basic posts list template and static data." %>
////
////
////
~~~html
<template name="postsList">
<div class="posts">
{{#each posts}}
{{> postItem}}
{{/each}}
</div>
</template>
~~~
<%= caption "client/views/posts/posts_list.html" %>
////
### The Value of "this"
////
~~~js
Template.postItem.helpers({
domain: function() {
var a = document.createElement('a');
a.href = this.url;
return a.hostname;
}
});
~~~
<%= caption "client/views/posts/post_item.js" %>
<%= commit "3-2", "Setup a `domain` helper on the `postItem`." %>
////
<%= screenshot "3-2", "Displaying domains for each links." %>
////
////
////
////
<% note do %>
### JavaScript Magic
////
////
////
<% end %>
////
<% note do %>
### Hot Code Reload
////
////
////
<% end %>