Turbinando o client-side com
Tiago Romero Garcia
Tiago Romero Garcia
Tiago Romero Garcia
Gerente Técnico na Avenue Code
Líder Técnico de Front-End
Desenvolvedor Full-Stack
www.avenuecode.com.br
Be part of the BEST!
Há muito tempo atrás, em uma galáxia muito,
muito distante....
É tempo de guerra dos navegadores. Desenvolvedores rebeldes, atacando de uma base escondida, tiveram sua primeira vitória contra o temível Império da Microsoft.
Durante a batalha, espiões rebeldes conseguiram roubar os planos da arma definitiva do Império, o INTERNET EXPLORER 6, um navegador armado com poder suficiente para destruir uma conexão de Internet por completo.
Perseguido pelos agentes sinistros do Império, nossos heróis correm contra o tempo para diminuir o tempo de resposta e melhorar a navegação web para salvar os usuários e restaurar a liberdade na galáxia....
NÃO SÃO A MESMA COISA!
POST
/users
cria um usuário (passando seus dados no corpo da requisição)GET
/users/1
recupera o usuário com id = 1PUT
/users/1
altera o usuário com id = 1 (passando seus dados no corpo)DELETE
/users/1
remove o usuário com id = 1
{
"name": "R2-D2",
"owners": ["Anakin", "Leia", "Luke"],
"attributes": {
"height": 0.96,
"mass": 32
}
}
MVC É O NOSSO HIPERESPAÇO!!
O BACKBONE.JS NÃO É UM FRAMEWORK MVC CLÁSSICO...
...MAS É DA FAMÍLIA MV*, COM OS MESMOS OBJETIVOS!!
var CardModel = Backbone.Model.extend({
urlRoot : '/api/cards'
});
urlRoot
especifica a URL base para as chamadas RESTfetch(options)
: recupera uma entidade por HTTP GETsave(attributes, options)
: cria uma entidade por HTTP POST (se objeto não possuir id) ou altera uma entidade por HTTP PUT (se objeto possuir id)destroy(options)
: remove uma entidade por HTTP DELETEattributes
: objeto contendo os dados a serem salvosoptions
: objeto contendo configurações como:
url
: URL de conexão com o server-side, ignorando urlRoot
success
: Função callback para resposta de sucessoerror
: Função callback para resposta de erro ou timeout
var model = new CardModel({
id: 1
});
// GET /api/cards/1
model.fetch({
success: function(model, response, options) {
console.log('Sucesso no fetch! Model = ' + model.toJSON());
},
error: function(model, response, options) {
console.log('Erro ou timeout no fetch.');
}
});
get(attribute)
: Obtém o valor de um dado do Model. Ex: card.get('title');
set(attribute, value)
: Define um valor para um dado do Model. Ex: card.set('title', 'Projeto X');
toJSON
: Retorna uma cópia dos dados do Model em JSON. Ex: card.toJSON();
var CardCollection = Backbone.Collection.extend({
model : CardModel,
url : '/api/cards'
});
model
especifica o Model manipuladourl
especifica a URL base para as chamadas RESTfetch(options)
: recupera um array de entidades por HTTP GET, popula cada entidade destas como um Model e a insere na Collection
var cardCollection = new CardCollection();
// GET /api/cards
cardCollection.fetch({
success: function(collection, response, options) {
console.log('Sucesso no fetch! Collection = ' + collection.toJSON());
},
error: function(collection, response, options) {
console.log('Erro ou timeout no fetch.');
}
});
get(id)
: Obtém um Model a partir de seu id. Ex: collection.get(12);
at(index)
: Obtém um Model a partir de sua posição na Collection. Ex: collection.at(1);
add(model)
: Adiciona um Model na Collection. Ex: collection.add({'title', 'Projeto X'});
remove(id)
: Remove um Model da Collection. Ex: collection.remove(12);
toJSON
: Retorna uma cópia dos dados da Collection em JSON. Ex: collection.toJSON();
where(attributes)
: Retorna apenas os elementos da Collection que corresponderem ao critério especificado. Ex: collection.where({'type', 'PROJECT'});
pluck(attribute)
: Retorna um array com o valor de um determinado atributo extraído de cada elemento da Collection. Ex: collection.pluck('title');
events
: objeto mapeador de eventos, da forma:'seletor CSS': função
/ 'nome_de_função'
render()
: método que concentra toda a lógica da View, realizando três etapas:
el
: elemento HTML renderizado por esta View. Pode ser acessado via $el
como um objeto jQueryid
: O atributo id
de el
className
: O atributo class
de el
tagName
: A tag HTML a ser utilizada por el
remove()
: Remove a View da DOM e remove listeners de eventos associados
var CardView = Backbone.View.extend({
events: {
'click button.close': function(e) {
e.preventDefault();
this.remove();
}
},
render: function() {
var result = '' + this.model.toJSON().title + '
' +
''),
this.$el.html(result);
}
});
el
: pode ser passado um elemento HTML existente para receber conteúdo renderizado pela Viewmodel
: O Model a ser consumido por render()
collection
: A Collection a ser consumida por render()
var cardModel = new CardModel({ id: 1 });
cardModel.fetch({
success: function(model, response, options) {
var cardView = new CardView({
model: cardModel
);
cardView.render();
$('#contents').append(cardView.el);
},
error: function(model, response, options) {
console.log('Erro ou timeout no fetch.');
}
});
routes
: objeto mapeador de rotas, da forma: 'seletor CSS': função
/ 'nome_de_função'
route(path, name)
: método que também insere uma rota, mas pode utilizar expressões regulares. Ex: router.route(/^card/(\d+)$/, 'viewCard');
navigate(path, options)
: método que navega para uma URL. Para também executar a rota, utilize options
como {trigger: true}
. Ex: router.navigate('/card/32',{trigger: true});
var AppRouter = Backbone.Router.extend({
routes : {
'' : 'viewAll',
'card/:id' : 'viewCard',
'*path' : 'viewAll'
},
viewAll: function() { ... },
viewCard: function(id) { ... }
});
Backbone.history.start()
para iniciar o monitoramento das rotas pelos Routers{pushState: true}
para usar o pushState do HTML5. Senão, o roteamento usará # no final da URL
var appRouter = new AppRouter();
Backbone.history.start({
pushState : true
});
{{#if children}}
{{#each children}}
- {{title}}: {{description}}
{{/each}}
{{else}}
Não há itens!
{{/if}}