No post anterior iniciamos a estrutura da nossa aplicação de blog. Agora vamos ver melhor a respeito da arquitetura MVC do Ext JS 4.
Model
1. Criar model no arquivo app/model/Post.js
Ext.define('EB.model.Post', {
extend: 'Ext.data.Model',
fields: [
{name: 'id', type: 'int' },
{name: 'title', type: 'string' },
{name: 'content', type: 'string' }
],
proxy: {
type: 'ajax',
url: 'data/posts.json',
reader: {
type: 'json',
root: 'posts',
idProperty: 'id'
}
}
});
2. Criar store no arquivo app/store/Posts.js
Ext.define('EB.store.Posts', {
extend : 'Ext.data.Store',
model : 'EB.model.Post'
});
3. Criar dados fictÃcios no arquivo data/posts.json
{
"posts": [
{"id":1, "title": "Post 1", "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id nisl tellus, nec pretium tortor. Duis luctus posuere felis vitae viverra. Vivamus nisl purus, pulvinar eget rhoncus et, mattis nec leo. Donec sagittis ultrices molestie. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas."},
{"id":2, "title": "Post 2", "content": "In hac habitasse platea dictumst. Nam commodo, augue id consequat ultricies, lacus augue pharetra odio, in aliquet neque magna vitae ipsum. Praesent porta dictum nibh, quis aliquam tortor volutpat nec. Nulla egestas nibh ac neque congue eu commodo dui elementum. Sed interdum massa sit amet odio aliquet at blandit mauris condimentum."},
{"id":3, "title": "Post 3", "content": "Vestibulum commodo pellentesque sagittis. Nullam sed venenatis mi. Etiam convallis turpis at velit faucibus lobortis. Sed pretium viverra dui vitae adipiscing. Quisque mattis mollis lectus. Nullam a convallis sapien. Donec vitae eleifend ipsum. Nam tortor ipsum, ultrices eget feugiat nec, sodales et magna."}
]
}
Fazendo desta forma a nossa camada de dados está pronta. Temos um model, aonde descrevemos os campos que o compõem, e o proxy que fará a conexão com o servidor. Definimos também o reader, que é o responsável por traduzir os dados que vêm do servidor para que o Ext possa criar as instâncias do model.
View
Agora vamos criar a listagem de posts, no arquivo app/view/post/List.js
Ext.define('EB.view.post.List',{
extend : 'Ext.view.View',
alias : 'widget.postlist',
//inits
initComponent: function()
{
Ext.apply(this,{
title : 'Posts',
store : 'Posts',
itemSelector: 'div.post-wrap',
tpl : new Ext.XTemplate(
'<tpl for=".">',
'<div style="margin-bottom: 10px;" class="post-wrap">',
'<h2>{title}</h2>',
'<p>{content}</p>',
'</div>',
'</tpl>'
)
});
this.callParent(arguments);
this.store.load();
}
});
EB.view.post.List é uma view bem simples. Ela extende de Ext.view.View, definindo o store e também o template utilizado para essa listagem. Vamos deixar os links de edição e exlusão de fora por enquanto.
Controller
Este é a parte responsável por juntar models, stores, views, e adicionar os eventos e interações. Por enquanto não vamos definir os eventos, vamos só criar o arquivo app/controller/Posts.js e juntar todas as partes
Ext.define('EB.controller.Posts', {
extend : 'Ext.app.Controller',
views : ['post.List'],
models : ['Post'],
stores : ['Posts']
});
Unindo as partes
Vamos adicionar o controller Posts à nossa definição de application em app.js
Ext.application({
name: 'EB', //app namespace (from ExtBlog)
controllers: ['Posts'], //here goes the controllers
autoCreateViewport: true //automatically creates Viewport
});
O app.js é nosso arquivo de entrada. Ele irá disparar o carregamento de controller definido em app/controller/Posts.js. Como dentro do nosso controller nós indicamos suas views, models e stores envolvidas, estes também serão carregados. No final temos tudo carregado e pronto para o uso!
Basta agora adicionar nossa listagem de posts ao Viewport, usando diretamente o alias postlist
//...
xtype: 'tabpanel',
region: 'center',
items: [{
xtype: 'postlist'
},{
title: 'Post 1',
html: '...post 1...'
}]
//...
Como resultado já podemos ver nossa listagem de arquivos sendo carregada. A estrutura MVC do Ext 4 permite que cada diferente parte de uma interface seja definida no seu devido lugar.
Apesar de termos já uma listagem, ainda falta interação para abrir o post e também as regras SASS para deixar a interface do jeito que queremos. Tudo isso será feito no próximo post!
Posts relacionados:






Muito bom cara!
Aqui tem uma das melhores fontes de estudo sobre ExtJS.
To gostando muito dessa serie de post.
Aguardo a parte 3 ^^
Muito bom o tuto Bruno, como sempre bem claro e obejtivo.
Parabéns.
Parabéns. Muto bom… Blog já nos favoritos. Esperando continuação.
Perfeito.
Parabéns Bruno.Ótimo exemplo.
Aguardo a próximo post.
Não abandone a série! :D
No aguardo pelo post seguinte
Ótimo, esperando a terceira parte. parabens.
Amigo,
Fica como sugestão para a parte 3, a inclusão da parte de autenticação.
Eu não consegui fazer o ultimo passo… dá um erro de JSON
O data/posts.js na verdade é .json certo ?
O erro que dá é esse:
” uncaught exception: [Exception… “‘Unable to parse the JSON returned by the server: You’re trying to decode an invalid JSON String: “
Isso! Era pra ser .json. Obrigado pela observação!