SlideShare uma empresa Scribd logo
1 de 22
Baixar para ler offline
JavaScript
Model View
Trabalhando com objetos ao invés de elementos HTML
HenriqueGogó
Ex-designer
Licenciatura em letras
Programador desde 2009
(antes era PHP e não conta)
Instituto Atlântico since 2012
Organização eventos JS
• BrazilJS 2011
• JSConfBR 2013 e 2014
• Comunidade CE.JS
(Eventos e hackatons)
Como o JavaScript
começou
“JavaScript was created in 10 days in May 1995 by
Brendan Eich (Netscape)”
https://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript
var person = prompt("Please enter your name");
if (person != null) {
document.write("Hello " + person + "!");
}
1995: Netscape cria o JavaScript
1996: ECMA padroniza
1997: ES1
1998: ES2
1999: ES3 - regex, try/catch
2005: Jesse James Garrett cunhou o termo Ajax
- Prototype, jQuery, Dojo and Mootools
2008: ES4 (abandonado)
2009: ES5 - strict, JSON, Reflect
2015: ES6 - class, arrows
Templates
EJS
Jade
Mustache.js
Microtemplating
<ul>
<% for(var i=0; i<supplies.length; i++) {%>
<li><%= supplies[i] %></li>
<% } %>
</ul>
{{#stooges}}
<b>{{name}}</b>
{{/stooges}}
Sobre o uso de templates
VANTAGENS
- Mudanças dinâmicas no HTML
- Interage com objetos e varáveis JS
de view
- Renderização no client-side
- Reuso
PROBLEMAS
- Código JS no HTML
- Pode ficar difícil manter
- Delay de renderização (compilação
em runtime)
- Renderiza mas a página ainda é
“burra” – não tem binds
- Reuso (sim, reuso) – pré-
carregamento = mais uma
requisição
jQuerye DOM
Seletores
Eventos
Binds
Callbacks
$("input[name=age]").on("change", function() {
if ($(this).val() > 15) {
console.log("Velhote");
}
});
$("form").submit(function() {
$.post("/users", $("form").serialize());
return false;
});
Sobre o uso de jQuery e binds
VANTAGENS
- Separação JS/HTML
- Plugins
- Compatibilidade multibrowser
- Extensível
PROBLEMAS
- Lidar com seletores e callbacks
pode deixar seu código bagunçado
- Se o designer alterar o HTML /
DOM, o código quebra
- Só olhando o código HTML não se
sabe os binds e ações dos
elementos
- Baixo reuso e alta acoplação
Precisamos de modelos para as views
Model-view-controller(MVC)
https://pt.wikipedia.org/wiki/MVC
• Um modelo (model) armazena dados e notifica suas visões e controladores
associados quando há uma mudança em seu estado. Estas notificações
permitem que as visões produzam saídas atualizadas e que os controladores
alterem o conjunto de comandos disponíveis. Uma implementação passiva do
MVC monta estas notificações, devido a aplicação não necessitar delas ou a
plataforma de software não suportá-las.
• A visão (view) Gera uma representação (Visão) dos dados presentes no
modelo solicita do modelo.
• O controller não vem ao caso no momento
Model-view-controller(MVC)
Segundo eu mesmo
Modelo é a inteligência em forma de objeto/classe
View é a apresentação desse objeto na tela.
Model-View são modelos de tela ou de partes da
tela no qual podem ser usados e reusados como
classes ou objetos JavaScript.
*Controller eu já disse que não vem ao caso no momento
class StatusBar extends React.Component {
constructor() {
super();
this.state = { icon: '', message: '' };
}
done = (message) => {
this.setState({ icon: 'info-sign', message: message });
}
error = (message) => {
this.setState({ icon: 'exclamation-sign', message: message });
}
render() {
return (
<span>
<span className = {'glyphicon glyphicon-' + this.state.icon}></span>
{this.state.message}
</span>
);
}
}
var statusBar = ReactDOM.render(
<StatusBar />,
document.querySelector("#statusbar")
);
statusBar.done(message);
// Class to represent a row in the seat reservations grid
function SeatReservation(name, initialMeal) {
var self = this;
self.name = name;
self.meal = ko.observable(initialMeal);
}
// Overall viewmodel for this screen, along with initial state
function ReservationsViewModel() {
var self = this;
// Non-editable catalog data - would come from the server
self.availableMeals = [
{ mealName: "Standard (sandwich)", price: 0 },
{ mealName: "Premium (lobster)", price: 34.95 },
{ mealName: "Ultimate (whole zebra)", price: 290 }
];
// Editable data
self.seats = ko.observableArray([
new SeatReservation("Steve", self.availableMeals[0]),
new SeatReservation("Bert", self.availableMeals[0])
]);
}
ko.applyBindings(new ReservationsViewModel());
<h2>Your seat reservations</h2>
<table>
<thead>
<tr>
<th>Passenger name</th>
<th>Meal</th>
<th>Surcharge</th>
<th></th>
</tr>
</thead>
<tbody data-bind="foreach: seats">
<tr>
<td data-bind="text: name"></td>
<td data-bind="text: meal().mealName"></td>
<td data-bind="text: meal().price"></td>
</tr>
</tbody>
</table>
class HeaderViewModel {
constructor() {
this.user = new User();
this.sync(this.apply);
}
sync(callback) {
// Get USER from server and...
this.user = new User({
name: "Carlos Barda Wellington",
avatar: "assets/imgs/atlantes/bardawil.jpg",
position: "Coordenador"
});
if (callback) callback(this);
}
apply() {
Template.render(this, document.querySelector('header'));
}
}
var headerViewModel = new HeaderViewModel();
headerViewModel.user = new User({
name: "Henrique Gogó",
avatar: "assets/imgs/atlantes/henrique.jpg",
position: "Coordenador"
});
headerViewModel.apply();
O que ganhamos com isso
1. Modelos que correspondem à tela
2. Programadores irão programar classes/objetos JavaScript e
não mais mexer com DOM/HTML
3. Reuso de componentes e comportamentos
4. Código conciso e com responsabilidades
5. Usamos um pattern bem difundido e amplamente aceito
(MVC)
Alguns frameworks
- Backbone.js (um dos primeiros, poucos usam hoje)
- Knockout.js (Microsoft adotou)
- Angular.js (Google)
- React.js (Facebook)
Obrigado!
(Perguntas?)

Mais conteúdo relacionado

Mais procurados

11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventosCentro Paula Souza
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMCAlisson Agiani
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Julian Cesar
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
Breve explicação sobre o que é AngularJs
Breve explicação sobre o que é AngularJsBreve explicação sobre o que é AngularJs
Breve explicação sobre o que é AngularJsRubens Fernandes
 
Javascript - Agora a coisa ficou séria.
Javascript - Agora a coisa ficou séria.Javascript - Agora a coisa ficou séria.
Javascript - Agora a coisa ficou séria.Luiz Henrique Estacio
 
jQuery básico (parte 1)
jQuery básico (parte 1)jQuery básico (parte 1)
jQuery básico (parte 1)Luís Cobucci
 
Criando componentes interativos em páginas AMP com amp-bind
Criando componentes interativos em páginas AMP com amp-bindCriando componentes interativos em páginas AMP com amp-bind
Criando componentes interativos em páginas AMP com amp-bindMurilo Siqueira Ferreira
 
Javascript - Biblioteca Jquery
Javascript - Biblioteca JqueryJavascript - Biblioteca Jquery
Javascript - Biblioteca JqueryMultside Digital
 
13 Java Script - Validação de formulário
13 Java Script  - Validação de formulário13 Java Script  - Validação de formulário
13 Java Script - Validação de formulárioCentro Paula Souza
 
Criando serviços com AngularJS
Criando serviços com AngularJSCriando serviços com AngularJS
Criando serviços com AngularJSRodrigo Branas
 
Desevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQueryDesevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQueryGuilherme
 

Mais procurados (20)

Java script aula 07 - eventos
Java script   aula 07 - eventosJava script   aula 07 - eventos
Java script aula 07 - eventos
 
11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMC
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
Breve explicação sobre o que é AngularJs
Breve explicação sobre o que é AngularJsBreve explicação sobre o que é AngularJs
Breve explicação sobre o que é AngularJs
 
Curso PHP: Básico JavaScript
Curso PHP: Básico JavaScriptCurso PHP: Básico JavaScript
Curso PHP: Básico JavaScript
 
jQuery
jQueryjQuery
jQuery
 
Html dom, eventos, jquery
Html dom, eventos, jqueryHtml dom, eventos, jquery
Html dom, eventos, jquery
 
Java script aula 05 - funções
Java script   aula 05 - funçõesJava script   aula 05 - funções
Java script aula 05 - funções
 
Java script - funções
Java script - funçõesJava script - funções
Java script - funções
 
Javascript - Agora a coisa ficou séria.
Javascript - Agora a coisa ficou séria.Javascript - Agora a coisa ficou séria.
Javascript - Agora a coisa ficou séria.
 
jQuery básico (parte 1)
jQuery básico (parte 1)jQuery básico (parte 1)
jQuery básico (parte 1)
 
Criando componentes interativos em páginas AMP com amp-bind
Criando componentes interativos em páginas AMP com amp-bindCriando componentes interativos em páginas AMP com amp-bind
Criando componentes interativos em páginas AMP com amp-bind
 
Javascript - Biblioteca Jquery
Javascript - Biblioteca JqueryJavascript - Biblioteca Jquery
Javascript - Biblioteca Jquery
 
13 Java Script - Validação de formulário
13 Java Script  - Validação de formulário13 Java Script  - Validação de formulário
13 Java Script - Validação de formulário
 
Criando serviços com AngularJS
Criando serviços com AngularJSCriando serviços com AngularJS
Criando serviços com AngularJS
 
Desevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQueryDesevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQuery
 
Ajax
AjaxAjax
Ajax
 

Semelhante a JavaScript Model-View no Frontend

KnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realKnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realComunidade NetPonto
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 
TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.Rogério Napoleão Jr.
 
Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6danielfcampos
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer FacesEduardo Bregaida
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesCI&T
 
Jsf – Java Sever Faces
Jsf – Java Sever FacesJsf – Java Sever Faces
Jsf – Java Sever Facesbielgott
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Anderson Araújo
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheirasLambda 3
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebElenilson Vieira
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Campus Party 2014 - Desenvolvimento Web com ASP.NET
Campus Party 2014 - Desenvolvimento Web com ASP.NETCampus Party 2014 - Desenvolvimento Web com ASP.NET
Campus Party 2014 - Desenvolvimento Web com ASP.NETEduardo Pires
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersHarlley Oliveira
 

Semelhante a JavaScript Model-View no Frontend (20)

KnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realKnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida real
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.
 
Model View Controller
Model View ControllerModel View Controller
Model View Controller
 
Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentes
 
Jsf – Java Sever Faces
Jsf – Java Sever FacesJsf – Java Sever Faces
Jsf – Java Sever Faces
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Campus Party 2014 - Desenvolvimento Web com ASP.NET
Campus Party 2014 - Desenvolvimento Web com ASP.NETCampus Party 2014 - Desenvolvimento Web com ASP.NET
Campus Party 2014 - Desenvolvimento Web com ASP.NET
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 

Mais de Henrique Gogó

PhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha CamaradaPhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha CamaradaHenrique Gogó
 
Conhecendo o CouchDB - TDC2011
Conhecendo o CouchDB - TDC2011Conhecendo o CouchDB - TDC2011
Conhecendo o CouchDB - TDC2011Henrique Gogó
 
Criando aplicações JavaScript com CouchApp + Sammy.js
Criando aplicações JavaScript com CouchApp + Sammy.jsCriando aplicações JavaScript com CouchApp + Sammy.js
Criando aplicações JavaScript com CouchApp + Sammy.jsHenrique Gogó
 
Urls amigáveis em JavaScript com Sammy JS
Urls amigáveis em JavaScript com Sammy JSUrls amigáveis em JavaScript com Sammy JS
Urls amigáveis em JavaScript com Sammy JSHenrique Gogó
 

Mais de Henrique Gogó (8)

Be React. Do Tests!
Be React. Do Tests!Be React. Do Tests!
Be React. Do Tests!
 
Introdução React.js
Introdução React.jsIntrodução React.js
Introdução React.js
 
PhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha CamaradaPhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha Camarada
 
NoSQL + Node.js
NoSQL + Node.jsNoSQL + Node.js
NoSQL + Node.js
 
Conhecendo o CouchDB - TDC2011
Conhecendo o CouchDB - TDC2011Conhecendo o CouchDB - TDC2011
Conhecendo o CouchDB - TDC2011
 
Criando aplicações JavaScript com CouchApp + Sammy.js
Criando aplicações JavaScript com CouchApp + Sammy.jsCriando aplicações JavaScript com CouchApp + Sammy.js
Criando aplicações JavaScript com CouchApp + Sammy.js
 
Conhecendo o CouchDB
Conhecendo o CouchDBConhecendo o CouchDB
Conhecendo o CouchDB
 
Urls amigáveis em JavaScript com Sammy JS
Urls amigáveis em JavaScript com Sammy JSUrls amigáveis em JavaScript com Sammy JS
Urls amigáveis em JavaScript com Sammy JS
 

JavaScript Model-View no Frontend

  • 1. JavaScript Model View Trabalhando com objetos ao invés de elementos HTML
  • 2. HenriqueGogó Ex-designer Licenciatura em letras Programador desde 2009 (antes era PHP e não conta) Instituto Atlântico since 2012 Organização eventos JS • BrazilJS 2011 • JSConfBR 2013 e 2014 • Comunidade CE.JS (Eventos e hackatons)
  • 3. Como o JavaScript começou “JavaScript was created in 10 days in May 1995 by Brendan Eich (Netscape)” https://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript
  • 4. var person = prompt("Please enter your name"); if (person != null) { document.write("Hello " + person + "!"); }
  • 5. 1995: Netscape cria o JavaScript 1996: ECMA padroniza 1997: ES1 1998: ES2 1999: ES3 - regex, try/catch 2005: Jesse James Garrett cunhou o termo Ajax - Prototype, jQuery, Dojo and Mootools 2008: ES4 (abandonado) 2009: ES5 - strict, JSON, Reflect 2015: ES6 - class, arrows
  • 6. Templates EJS Jade Mustache.js Microtemplating <ul> <% for(var i=0; i<supplies.length; i++) {%> <li><%= supplies[i] %></li> <% } %> </ul> {{#stooges}} <b>{{name}}</b> {{/stooges}}
  • 7. Sobre o uso de templates VANTAGENS - Mudanças dinâmicas no HTML - Interage com objetos e varáveis JS de view - Renderização no client-side - Reuso PROBLEMAS - Código JS no HTML - Pode ficar difícil manter - Delay de renderização (compilação em runtime) - Renderiza mas a página ainda é “burra” – não tem binds - Reuso (sim, reuso) – pré- carregamento = mais uma requisição
  • 8. jQuerye DOM Seletores Eventos Binds Callbacks $("input[name=age]").on("change", function() { if ($(this).val() > 15) { console.log("Velhote"); } }); $("form").submit(function() { $.post("/users", $("form").serialize()); return false; });
  • 9. Sobre o uso de jQuery e binds VANTAGENS - Separação JS/HTML - Plugins - Compatibilidade multibrowser - Extensível PROBLEMAS - Lidar com seletores e callbacks pode deixar seu código bagunçado - Se o designer alterar o HTML / DOM, o código quebra - Só olhando o código HTML não se sabe os binds e ações dos elementos - Baixo reuso e alta acoplação
  • 10. Precisamos de modelos para as views
  • 11. Model-view-controller(MVC) https://pt.wikipedia.org/wiki/MVC • Um modelo (model) armazena dados e notifica suas visões e controladores associados quando há uma mudança em seu estado. Estas notificações permitem que as visões produzam saídas atualizadas e que os controladores alterem o conjunto de comandos disponíveis. Uma implementação passiva do MVC monta estas notificações, devido a aplicação não necessitar delas ou a plataforma de software não suportá-las. • A visão (view) Gera uma representação (Visão) dos dados presentes no modelo solicita do modelo. • O controller não vem ao caso no momento
  • 12. Model-view-controller(MVC) Segundo eu mesmo Modelo é a inteligência em forma de objeto/classe View é a apresentação desse objeto na tela. Model-View são modelos de tela ou de partes da tela no qual podem ser usados e reusados como classes ou objetos JavaScript. *Controller eu já disse que não vem ao caso no momento
  • 13. class StatusBar extends React.Component { constructor() { super(); this.state = { icon: '', message: '' }; } done = (message) => { this.setState({ icon: 'info-sign', message: message }); } error = (message) => { this.setState({ icon: 'exclamation-sign', message: message }); } render() { return ( <span> <span className = {'glyphicon glyphicon-' + this.state.icon}></span> {this.state.message} </span> ); } }
  • 14. var statusBar = ReactDOM.render( <StatusBar />, document.querySelector("#statusbar") ); statusBar.done(message);
  • 15.
  • 16.
  • 17. // Class to represent a row in the seat reservations grid function SeatReservation(name, initialMeal) { var self = this; self.name = name; self.meal = ko.observable(initialMeal); } // Overall viewmodel for this screen, along with initial state function ReservationsViewModel() { var self = this; // Non-editable catalog data - would come from the server self.availableMeals = [ { mealName: "Standard (sandwich)", price: 0 }, { mealName: "Premium (lobster)", price: 34.95 }, { mealName: "Ultimate (whole zebra)", price: 290 } ]; // Editable data self.seats = ko.observableArray([ new SeatReservation("Steve", self.availableMeals[0]), new SeatReservation("Bert", self.availableMeals[0]) ]); } ko.applyBindings(new ReservationsViewModel()); <h2>Your seat reservations</h2> <table> <thead> <tr> <th>Passenger name</th> <th>Meal</th> <th>Surcharge</th> <th></th> </tr> </thead> <tbody data-bind="foreach: seats"> <tr> <td data-bind="text: name"></td> <td data-bind="text: meal().mealName"></td> <td data-bind="text: meal().price"></td> </tr> </tbody> </table>
  • 18. class HeaderViewModel { constructor() { this.user = new User(); this.sync(this.apply); } sync(callback) { // Get USER from server and... this.user = new User({ name: "Carlos Barda Wellington", avatar: "assets/imgs/atlantes/bardawil.jpg", position: "Coordenador" }); if (callback) callback(this); } apply() { Template.render(this, document.querySelector('header')); } }
  • 19. var headerViewModel = new HeaderViewModel(); headerViewModel.user = new User({ name: "Henrique Gogó", avatar: "assets/imgs/atlantes/henrique.jpg", position: "Coordenador" }); headerViewModel.apply();
  • 20. O que ganhamos com isso 1. Modelos que correspondem à tela 2. Programadores irão programar classes/objetos JavaScript e não mais mexer com DOM/HTML 3. Reuso de componentes e comportamentos 4. Código conciso e com responsabilidades 5. Usamos um pattern bem difundido e amplamente aceito (MVC)
  • 21. Alguns frameworks - Backbone.js (um dos primeiros, poucos usam hoje) - Knockout.js (Microsoft adotou) - Angular.js (Google) - React.js (Facebook)