SlideShare une entreprise Scribd logo
1  sur  35
28ª Reunião Lisboa - 21/04/2012   http://netponto.org




       KnockoutJS com ASP.NET MVC 3:
                Utilização na vida real
                                  Marco André Silva
Patrocinadores desta reunião
Marco André Silva
• Consultor Sénior na |create|it|, uma empresa
  especializada na área de soluções colaborativas e
  integração de sistemas.

• Actualmente é responsável pela área de soluções
  da|create|it|, desenvolvendo também aplicações
  baseadas em SharePoint, ASP.NET, WCF e outras
  tecnologias Microsoft.

• Os seus principais interesses são o desenvolvimento de
  arquitecturas de serviços e interfaces ricas
Agenda
•   ASP.NET MVC 3
•   Knockout JS
•   Demo – Knockout O Essencial
•   Integração Knockout JS com ASP.NET MVC 3
•   Demo – Knockout JS com ASP.NET MVC 3
•   Experiência de utilização
•   O futuro
•   Conclusões
Contexto
•   Projecto com 6 pessoas

•   + 1 ano

•   Aplicação Web

•   Volume elevado de informação a apresentar

•   Experiência de utilização similar a aplicação nativa

•   Desafios de usabilidade e interacção com a aplicação

•   Facilidade de manutenção e evolução da aplicação

 Reflecte a nossa experiência e melhores práticas e não uma verdade universal
Model
ASP.NET MVC 3 - Introdução
• Browser faz pedido (GET) a URL                    View           Controller


• Rota é determinada

• Controlador é instanciado

• Acção de controlador é invocada

• Controlador processa pedido e retorna modelo para a vista

• Vista (HTML) é elaborada com base no modelo
Knockout JS (KO JS) - Introdução
•   Biblioteca JavaScript Open source

•   Funciona do lado do cliente (browser), e promover interactividade

•   Padrão MVVM – Separar lógica de negócio de interface

•   Suporte para vários browsers

•   Não existem event handlers de JavaScript/Jquery. Existe sim, JavaScript object-oriented e bindings declarativos

•   Binding automático em dois sentidos:
     –   Da interface para o modelo
     –   Do modelo para a interface

•   Calculo automático de dependências

•   Suporte para templating

•   Diversos tipos de bindings out-of-box com possibilidade de implementar custom bindings

•   Desenvolvido e mantido por Steve Sanderson, colaborador da Microsoft, mas o KO é um projecto pessoal e open-source

•   Versão actual 2.0. Versão 2.1 a caminho.
Model
Knockout JS - MVVM
• Informação importada do Modelo para o     View
                                                           View
                                                           Model
  ViewModel

• Quando a informação do ViewModel é actualizada é
  exportada de volta para o Modelo

• Quando a informação do ViewModel é actualizada, a
  Vista é automaticamente actualizada

• Quando a informação da Vista é alterada, o ViewModel é
  automaticamente alterado
Knockout JS – Data Binding - Conceito
     View                    Model




              Data Binding
              View Model
Knockout JS – Data Binding - Exemplo
// ViewModel
var cartLineViewModel = {
    category: ‘Ships’,
    product: ‘The Titanic’,
    quantity: 123
};

// View -> Data Binding
The category is <span data-bind=‚text: category‛ />

// Activar KO
ko.applyBindings(cartLineViewModel);
Knockout JS – Observables
Actualização automática da UI
// ViewModel
var cartLineViewModel = {
    category: ko.observable(‘Ships’),
    product: ko.observable(‘The Titanic’),
    quantity: ko.observable(123)
};

// View -> Data Binding
The category is <span data-bind=‚text: category‛ />
The category is <input data-bind=‚value: category‛ />

// Activar KO
ko.applyBindings(cartLineViewModel);
Knockout JS – Computed Observables
Calculo Automático de Dependências

// ViewModel
var cartLineViewModel = {
    …
    subtotal: ko.computed(function() {
        return this.product().price * this.quantity();
    }, this);
};

// View -> Data Binding
The sub total is <span data-bind=‚text: subtotal‛ />

// Activar KO
ko.applyBindings(cartLineViewModel);
Knockout JS – Observable Arrays
// ViewModel
var cartViewModel = {
    …
    lines: ko.observableArray([cartLineViewModel]);
};

// View -> Data Binding
…
<tbody data-bind=‚foreach: lines‛>
…
</tbody>

// Activar KO
ko.applyBindings(cartViewModel);
Knockout JS – Form Bindings
// ViewModel
var cartViewModel = {
    …
    this.lines = ko.observableArray([cartLineViewModel]);
    this.addLine = function(){this.lines.push(new CartLine())};
    this.removeLine = function(line){this.lines.remove(line)};
};

// View -> Data Binding
…
<tbody data-bind=‚foreach: lines‛>
…
    <td>
       <a href='#' data-bind=‚click: $parent.removeLine‛>Remove</a>
    </td>
</tbody>
<button data-bind=‚click: addLine‛>Add product</button>

// Activar KO
ko.applyBindings(cartViewModel);
Knockout JS – Ler e Gravar
•   Formato dados: JSON
•   $.ajax

•   Gravar
     –    Conversão de viewModel para JSON
            • ko.toJSON ou
            • Mapping plugin
     –    $.ajax(urlGravar, JSON)
     –    ko.toJSON também útil para fazer debug

•   Ler
     –    JSON = $.ajax(urlObter)
     –    Criar / Actualizar viewModel
             •   Manual ou
             •   Mapping Plugin

•   Mapping Plugin
     –    Biblioteca separada
     –    Converte “cegamente” propriedades em Observables, e arrays em ObservableArrays
     –    Ler:
             •   ko.mapping.fromJS / fromJSON
     –    Gravar:
             •   ko.mapping.toJS / toJSON
Knockout JS – O essencial
Resumo KO JS
•   MVVM:
     – View (HTML) / ViewModel (JavaScript) / Model (JavaScript)

•   Conceito observable
     – Calculo automático de dependências

•   Conceito de bindings:
     – Declarativos
     – Sincronização modelo   UI automático

•   Funções JavaScript para responder a bindings:
     – Validações
     – Lógica de negócio

•   Controlo de Fluxo:
     – Foreach
     – if

•   Formato JSON para leitura / gravação (interacção com o servidor)
KO JS - Integração com ASP.NET MVC 3
KO JS - Integração com ASP.NET MVC 3
• Paradigma diferente do desenvolvimento
  MVC normal:
  – Geração da página no cliente em vez de no
   servidor

  – View Models desenhados de forma diferente
   a pensar no cliente

  – Lógica de negócio no cliente
KO JS - Integração com ASP.NET MVC 3
•   Inclusão referência:
     – <script type='text/javascript' src='knockout.js'></script>

•   Estruturação de Views e inclusão de JavaScripts

•   Models MVC  Models Knockout JS
     – Geração de modelos JavaScript  Leitura
     – Resultados de acções em formato JSON  Leitura

•   Models Knockout JS  Models MVC
     – Model Binding MVC 3 a partir de JSON  Gravação

•   Elaboração de Views
     – Model Validation & Data Annotations

•   Alternativa: Utilização de HTML Helpers
KO JS – MVC 3
Estruturação de Views e JavaScript
MVC View
// View model (se necessário)
@model CartViewModel

// KO JS references
<script src="@Url.Content("~/Scripts/Knockoutjs/knockout-latest.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/Knockoutjs/knockout.mapping-latest.js")" type="text/javascript"></script>
…
// View scripts
@section Scripts
{
  // Passagem de parâmetros para JavaScript
  <script language="javascript" type="text/javascript">
    var settings = {
       urlSave: '@Url.Action(‚Save", ‚Cart")’,
       urlGet: '@Url.Action(‚Get", ‚Cart")’,
       id: @Model.Id // Se existir View Model
    };
  </script>

    // KO JS ViewModel
    <script src="@Url.Content("~/Scripts/App/Cart.js")‛ type="text/javascript"></script>
}

JavaScript
  // KO JS ViewModel
  var cartViewModel = {
    serverModel: {}
  }
KO JS – MVC 3
Models MVC  Models KO – Geração inline na vista MVC
MVC View
// View model (necessário!!!)
@model CartViewModel
…
// View scripts
@section Scripts
{
  // Passagem de parâmetros para JavaScript
  <script language="javascript" type="text/javascript">
    var settings = {
       …
       // Geração de modelo JavaScript a partir de classe de modelo MVC
       clientModel: @(Html.InterpretJson(Model))
    };
  </script>

    // KO JS ViewModel
    <script src="@Url.Content("~/Scripts/App/Cart.js")‛ type="text/javascript"> </script>
}

JavaScript
    // Gerar Client Model a partir do model contido na página
    cartViewModel.serverModel = ko.mapping.fromJSON(serverModel);
KO JS – MVC 3
Models MVC  Models KO – Resultado de acção em formato JSON
MVC View
…
                                                          MVC Controller
// View scripts                                           public ActionResult Edit(int id)
@section Scripts
{                                                         {
  // Passagem de parâmetros para JavaScript
  <script language="javascript" type="text/javascript">
                                                           // Retornar vista  Pode ter modelo
    var settings = {                                      (tipicamente simples), ou ser apenas HTML
       …                                                  markup
    };
  </script>                                                return View();
  // KO JS ViewModel                                      }
  <script src="@Url.Content("~/Scripts/App/Cart.js")‛
type="text/javascript"></script>
}                                                         public ActionResult Get(int id)
JavaScript                                                {
 // Dialogo de aguarde
 ToggleLoadingDialog();                                    // Criar modelo
                                                           CartViewModel viewModel = BuildViewModel(
// Obter model do servidor  Acção Get do controlador
var serverModel = GetServerModel();                       id);
 // Gerar Client Model a partir de model do servidor
 cartViewModel.serverModel = ko.mapping.fromJSON(          // Retornar modelo em JSON
serverModel);
                                                           return Json(viewModel);
                                                          }
KO JS – MVC 3
Models KO  Models MVC – Model Binding MVC 3 a partir de JSON
JavaScript                                       Model Class
var cartViewModel = {
                                                 public class Cart
  save: function() {
    // Validar página / modelo                   {
    …                                             // Cart lines
    // Dialogo de aguarde                         public List<CartLine> Lines { get; set; }
    ToggleLoadingDialog();                       }

    // Submeter pedido de gravação ao servidor
    $.ajax(ko.mapping.toJSON(                    public class CartLine
cartViewModel.serverModel);                      {
                                                  public string Category { get; set; }
MVC Controller
[HttpPost]                                        public string Product { get; set; }
public ActionResult Save(Cart cart)               public int Quantity { get; set; }
{                                                 public int SubTotal { get; set; }
 // Gravar
 Repository.Save(cart);                          }

 // Retornar resultado relevante da acção
 return Json(result);
}
KO JS – MVC 3
Elaboração de Views
MVC View
@model CartViewModel
…
// Percorrer cada linha
<tbody data-bind='foreach: cartViewModel.serverModel.Lines'>
  …
 // Com o produto da linha
 <td class='price' data-bind='with: Product'>
    // Produto tem preço
    <span data-bind='text: formatCurrency(price)'> </span>
 </td>
 // Se a linha tiver um produto, mostrar quantidade. Incluir validações
 <td class='quantity'>
    <input
      name="@Html.NameFor(m => m.Product.Quantity)"
      data-bind='visible: product, value: quantity, valueUpdate: "afterkeydown"'
      @Html.ValidationAttributesFor(m => m.Product.Quantity) />
      @Html.ValidationMessageFor(m => m.Product.Quantity)
 </td>
 // Se a linha tiver um produto, mostrar subtotal
 <td class='price'>
    <span data-bind='visible: product, text: formatCurrency(subtotal())' > </span>
 </td>
 // Link para remover linha de produto. Chama função do view model
 <td>
    <a href='#' data-bind='click: $parent.removeLine'>Remove</a>
 </td>
 …
</tbody>
…
// Botões de acção. Chamam funções do view Model
<button data-bind='click: addLine'>Add product</button>
<button data-bind='click: save'>Submit order</button>
Knockout JS com ASP.NET MVC 3
Experiência de utilização
O menos bom

• Bugs de Model Binding de MVC

• Mapping Plugin de KO e modelos grandes (Script running
  too long)

• Execução de pedidos AJAX manualmente (GET / POST)

• Performance do serializer JSON usado no MVC

• Articulação com MVC Data Annotation Validations
Experiência de Utilização
O bom

•   Model Binding de JSON

•   Geração de modelos cliente a partir de modelos servidor

•   Mapping Plugin de KO

•   Data Binding e Facilidade de criação da UI no cliente

•   Trabalhar no cliente com objectos em vez de eventos

•   Facilidade de construção da aplicação

•   Fluidez da aplicação no cliente

•   Essencial para desenvolver Single Page Applications!!!!
O futuro – MVC 4
Servidor                    Cliente
                                          Visible UI
                                          HTML/CSS
      Web UI
     HTML/CSS/JS
                                                        Knockout.js



    Data Services                     Application Layer                           Navigation APIs
      JSON/XML                             JavaScript

             WebAPI                                                                        History.js



                                      Data Access Layer               UpShot.js
                                           JavaScript




                                        Local Storage                 HTML 5
                      MVC
Conclusões
• As duas tecnologias resultam bem em conjunto

• Desenvolvimento mais facilitado

• Aplicações mais fluidas e rápidas

• Grande foco na interacção com o utilizador

• Conceitos aplicam-se também fora de aplicações Web (ex:
  Apps para Windows 8)
Questões?
Referências
ASP.NET MVC
   – http://www.asp.net/mvc


ASP.NET MVC 4
   – http://www.asp.net/mvc/mvc4


Knockout JS
   – http://www.knockoutjs.com


Knockout JS Tutorials
   – http://learn.knockoutjs.com/
Patrocinadores desta reunião
Próximas reuniões presenciais
• 21-04-2012 – Abril
• 26-05-2012 – Maio
• 02-06-2012 – Junho (Coimbra)
• 16-06-2012 – Junho
• 21-07-2012 – Julho

Reserva estes dias na agenda! :)
Obrigado!
Marco André Silva
marco.silva@create.pt

Contenu connexe

Tendances (20)

Java Web 1 Introducao
Java Web 1 IntroducaoJava Web 1 Introducao
Java Web 1 Introducao
 
Apresentação jsf 1_2
Apresentação jsf 1_2Apresentação jsf 1_2
Apresentação jsf 1_2
 
Java web
Java webJava web
Java web
 
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
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Apresentação Java Web - Jsf+Hibernate
Apresentação Java Web - Jsf+HibernateApresentação Java Web - Jsf+Hibernate
Apresentação Java Web - Jsf+Hibernate
 
Ajax
AjaxAjax
Ajax
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
 
Framework web 02 - 2016
Framework web 02 - 2016Framework web 02 - 2016
Framework web 02 - 2016
 
Curso jsf
Curso jsfCurso jsf
Curso jsf
 
introdução a ajax
introdução a ajaxintrodução a ajax
introdução a ajax
 
Framework web 3 - JSF + Spring boot
Framework web 3 - JSF + Spring bootFramework web 3 - JSF + Spring boot
Framework web 3 - JSF + Spring boot
 
Php 06 Crud Mvc
Php 06 Crud MvcPhp 06 Crud Mvc
Php 06 Crud Mvc
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectados
 
Prog web 08-php-mvc
Prog web 08-php-mvcProg web 08-php-mvc
Prog web 08-php-mvc
 
JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no Frontend
 
Apostila Java Web com JSF, JPA e Primefaces
Apostila Java Web com JSF, JPA e PrimefacesApostila Java Web com JSF, JPA e Primefaces
Apostila Java Web com JSF, JPA e Primefaces
 
Jsf com hibernate, spring security e maven
Jsf com hibernate, spring security e mavenJsf com hibernate, spring security e maven
Jsf com hibernate, spring security e maven
 
ApresentaçãO Mvc
ApresentaçãO MvcApresentaçãO Mvc
ApresentaçãO Mvc
 
Java Web Dev Introdução
Java Web Dev IntroduçãoJava Web Dev Introdução
Java Web Dev Introdução
 

Similaire à KnockoutJS com ASP.NET MVC 3 na vida real

LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheirasLambda 3
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webelliando dias
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifaguestea329c
 
Ebook AngularJS | Guia Introdutório
Ebook AngularJS | Guia Introdutório Ebook AngularJS | Guia Introdutório
Ebook AngularJS | Guia Introdutório Portal GSTI
 
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
 
Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no NubankDevCamp Campinas
 
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.
 
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 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
Jsf – Java Sever Faces
Jsf – Java Sever FacesJsf – Java Sever Faces
Jsf – Java Sever Facesbielgott
 
Desenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosDesenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosRodolfo Fadino Junior
 
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
 

Similaire à KnockoutJS com ASP.NET MVC 3 na vida real (20)

LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
Palestra ASP.NET MVC
Palestra ASP.NET MVCPalestra ASP.NET MVC
Palestra ASP.NET MVC
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
 
Asp.Net Mvc Dev Days09 V3 Pt
Asp.Net Mvc Dev Days09 V3 PtAsp.Net Mvc Dev Days09 V3 Pt
Asp.Net Mvc Dev Days09 V3 Pt
 
Apresentação M V C
Apresentação M V CApresentação M V C
Apresentação M V C
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifa
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Ebook AngularJS | Guia Introdutório
Ebook AngularJS | Guia Introdutório Ebook AngularJS | Guia Introdutório
Ebook AngularJS | Guia Introdutório
 
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
 
Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no Nubank
 
Spring MVC - QConSP
Spring MVC - QConSPSpring MVC - QConSP
Spring MVC - QConSP
 
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.
 
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 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Jsf – Java Sever Faces
Jsf – Java Sever FacesJsf – Java Sever Faces
Jsf – Java Sever Faces
 
Jsf
JsfJsf
Jsf
 
Desenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosDesenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São Carlos
 
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
 
Grails
GrailsGrails
Grails
 

Plus de Comunidade NetPonto

Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Comunidade NetPonto
 
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Comunidade NetPonto
 
MVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaMVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaComunidade NetPonto
 
Deep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaDeep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaComunidade NetPonto
 
The power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloThe power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloComunidade NetPonto
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoComunidade NetPonto
 
NoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazNoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazComunidade NetPonto
 
De Zero a Produção - João Jesus
De Zero a Produção - João JesusDe Zero a Produção - João Jesus
De Zero a Produção - João JesusComunidade NetPonto
 
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComo deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComunidade NetPonto
 
Case studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsCase studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsComunidade NetPonto
 
Aspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpAspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpComunidade NetPonto
 
Utilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes UnitáriosUtilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes UnitáriosComunidade NetPonto
 
Dinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoDinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoComunidade NetPonto
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComunidade NetPonto
 
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteWindows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteComunidade NetPonto
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIComunidade NetPonto
 
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8Comunidade NetPonto
 

Plus de Comunidade NetPonto (20)

Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
 
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
 
MVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaMVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara Silva
 
Deep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaDeep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo Costa
 
The power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloThe power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno Cancelo
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis Paulino
 
ASP.NET Signal R - Glauco Godoi
ASP.NET Signal R - Glauco GodoiASP.NET Signal R - Glauco Godoi
ASP.NET Signal R - Glauco Godoi
 
NoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazNoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor Tomaz
 
HTML5 - Pedro Rosa
HTML5 - Pedro RosaHTML5 - Pedro Rosa
HTML5 - Pedro Rosa
 
De Zero a Produção - João Jesus
De Zero a Produção - João JesusDe Zero a Produção - João Jesus
De Zero a Produção - João Jesus
 
OData – Super Cola W3
OData – Super Cola W3OData – Super Cola W3
OData – Super Cola W3
 
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComo deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
 
Case studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsCase studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store Apps
 
Aspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpAspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharp
 
Utilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes UnitáriosUtilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes Unitários
 
Dinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoDinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de Projecto
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
 
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteWindows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web API
 
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
 

KnockoutJS com ASP.NET MVC 3 na vida real

  • 1. 28ª Reunião Lisboa - 21/04/2012 http://netponto.org KnockoutJS com ASP.NET MVC 3: Utilização na vida real Marco André Silva
  • 3. Marco André Silva • Consultor Sénior na |create|it|, uma empresa especializada na área de soluções colaborativas e integração de sistemas. • Actualmente é responsável pela área de soluções da|create|it|, desenvolvendo também aplicações baseadas em SharePoint, ASP.NET, WCF e outras tecnologias Microsoft. • Os seus principais interesses são o desenvolvimento de arquitecturas de serviços e interfaces ricas
  • 4. Agenda • ASP.NET MVC 3 • Knockout JS • Demo – Knockout O Essencial • Integração Knockout JS com ASP.NET MVC 3 • Demo – Knockout JS com ASP.NET MVC 3 • Experiência de utilização • O futuro • Conclusões
  • 5. Contexto • Projecto com 6 pessoas • + 1 ano • Aplicação Web • Volume elevado de informação a apresentar • Experiência de utilização similar a aplicação nativa • Desafios de usabilidade e interacção com a aplicação • Facilidade de manutenção e evolução da aplicação  Reflecte a nossa experiência e melhores práticas e não uma verdade universal
  • 6. Model ASP.NET MVC 3 - Introdução • Browser faz pedido (GET) a URL View Controller • Rota é determinada • Controlador é instanciado • Acção de controlador é invocada • Controlador processa pedido e retorna modelo para a vista • Vista (HTML) é elaborada com base no modelo
  • 7. Knockout JS (KO JS) - Introdução • Biblioteca JavaScript Open source • Funciona do lado do cliente (browser), e promover interactividade • Padrão MVVM – Separar lógica de negócio de interface • Suporte para vários browsers • Não existem event handlers de JavaScript/Jquery. Existe sim, JavaScript object-oriented e bindings declarativos • Binding automático em dois sentidos: – Da interface para o modelo – Do modelo para a interface • Calculo automático de dependências • Suporte para templating • Diversos tipos de bindings out-of-box com possibilidade de implementar custom bindings • Desenvolvido e mantido por Steve Sanderson, colaborador da Microsoft, mas o KO é um projecto pessoal e open-source • Versão actual 2.0. Versão 2.1 a caminho.
  • 8. Model Knockout JS - MVVM • Informação importada do Modelo para o View View Model ViewModel • Quando a informação do ViewModel é actualizada é exportada de volta para o Modelo • Quando a informação do ViewModel é actualizada, a Vista é automaticamente actualizada • Quando a informação da Vista é alterada, o ViewModel é automaticamente alterado
  • 9. Knockout JS – Data Binding - Conceito View Model Data Binding View Model
  • 10. Knockout JS – Data Binding - Exemplo // ViewModel var cartLineViewModel = { category: ‘Ships’, product: ‘The Titanic’, quantity: 123 }; // View -> Data Binding The category is <span data-bind=‚text: category‛ /> // Activar KO ko.applyBindings(cartLineViewModel);
  • 11. Knockout JS – Observables Actualização automática da UI // ViewModel var cartLineViewModel = { category: ko.observable(‘Ships’), product: ko.observable(‘The Titanic’), quantity: ko.observable(123) }; // View -> Data Binding The category is <span data-bind=‚text: category‛ /> The category is <input data-bind=‚value: category‛ /> // Activar KO ko.applyBindings(cartLineViewModel);
  • 12. Knockout JS – Computed Observables Calculo Automático de Dependências // ViewModel var cartLineViewModel = { … subtotal: ko.computed(function() { return this.product().price * this.quantity(); }, this); }; // View -> Data Binding The sub total is <span data-bind=‚text: subtotal‛ /> // Activar KO ko.applyBindings(cartLineViewModel);
  • 13. Knockout JS – Observable Arrays // ViewModel var cartViewModel = { … lines: ko.observableArray([cartLineViewModel]); }; // View -> Data Binding … <tbody data-bind=‚foreach: lines‛> … </tbody> // Activar KO ko.applyBindings(cartViewModel);
  • 14. Knockout JS – Form Bindings // ViewModel var cartViewModel = { … this.lines = ko.observableArray([cartLineViewModel]); this.addLine = function(){this.lines.push(new CartLine())}; this.removeLine = function(line){this.lines.remove(line)}; }; // View -> Data Binding … <tbody data-bind=‚foreach: lines‛> … <td> <a href='#' data-bind=‚click: $parent.removeLine‛>Remove</a> </td> </tbody> <button data-bind=‚click: addLine‛>Add product</button> // Activar KO ko.applyBindings(cartViewModel);
  • 15. Knockout JS – Ler e Gravar • Formato dados: JSON • $.ajax • Gravar – Conversão de viewModel para JSON • ko.toJSON ou • Mapping plugin – $.ajax(urlGravar, JSON) – ko.toJSON também útil para fazer debug • Ler – JSON = $.ajax(urlObter) – Criar / Actualizar viewModel • Manual ou • Mapping Plugin • Mapping Plugin – Biblioteca separada – Converte “cegamente” propriedades em Observables, e arrays em ObservableArrays – Ler: • ko.mapping.fromJS / fromJSON – Gravar: • ko.mapping.toJS / toJSON
  • 16. Knockout JS – O essencial
  • 17. Resumo KO JS • MVVM: – View (HTML) / ViewModel (JavaScript) / Model (JavaScript) • Conceito observable – Calculo automático de dependências • Conceito de bindings: – Declarativos – Sincronização modelo   UI automático • Funções JavaScript para responder a bindings: – Validações – Lógica de negócio • Controlo de Fluxo: – Foreach – if • Formato JSON para leitura / gravação (interacção com o servidor)
  • 18. KO JS - Integração com ASP.NET MVC 3
  • 19. KO JS - Integração com ASP.NET MVC 3 • Paradigma diferente do desenvolvimento MVC normal: – Geração da página no cliente em vez de no servidor – View Models desenhados de forma diferente a pensar no cliente – Lógica de negócio no cliente
  • 20. KO JS - Integração com ASP.NET MVC 3 • Inclusão referência: – <script type='text/javascript' src='knockout.js'></script> • Estruturação de Views e inclusão de JavaScripts • Models MVC  Models Knockout JS – Geração de modelos JavaScript  Leitura – Resultados de acções em formato JSON  Leitura • Models Knockout JS  Models MVC – Model Binding MVC 3 a partir de JSON  Gravação • Elaboração de Views – Model Validation & Data Annotations • Alternativa: Utilização de HTML Helpers
  • 21. KO JS – MVC 3 Estruturação de Views e JavaScript MVC View // View model (se necessário) @model CartViewModel // KO JS references <script src="@Url.Content("~/Scripts/Knockoutjs/knockout-latest.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/Knockoutjs/knockout.mapping-latest.js")" type="text/javascript"></script> … // View scripts @section Scripts { // Passagem de parâmetros para JavaScript <script language="javascript" type="text/javascript"> var settings = { urlSave: '@Url.Action(‚Save", ‚Cart")’, urlGet: '@Url.Action(‚Get", ‚Cart")’, id: @Model.Id // Se existir View Model }; </script> // KO JS ViewModel <script src="@Url.Content("~/Scripts/App/Cart.js")‛ type="text/javascript"></script> } JavaScript // KO JS ViewModel var cartViewModel = { serverModel: {} }
  • 22. KO JS – MVC 3 Models MVC  Models KO – Geração inline na vista MVC MVC View // View model (necessário!!!) @model CartViewModel … // View scripts @section Scripts { // Passagem de parâmetros para JavaScript <script language="javascript" type="text/javascript"> var settings = { … // Geração de modelo JavaScript a partir de classe de modelo MVC clientModel: @(Html.InterpretJson(Model)) }; </script> // KO JS ViewModel <script src="@Url.Content("~/Scripts/App/Cart.js")‛ type="text/javascript"> </script> } JavaScript // Gerar Client Model a partir do model contido na página cartViewModel.serverModel = ko.mapping.fromJSON(serverModel);
  • 23. KO JS – MVC 3 Models MVC  Models KO – Resultado de acção em formato JSON MVC View … MVC Controller // View scripts public ActionResult Edit(int id) @section Scripts { { // Passagem de parâmetros para JavaScript <script language="javascript" type="text/javascript"> // Retornar vista  Pode ter modelo var settings = { (tipicamente simples), ou ser apenas HTML … markup }; </script> return View(); // KO JS ViewModel } <script src="@Url.Content("~/Scripts/App/Cart.js")‛ type="text/javascript"></script> } public ActionResult Get(int id) JavaScript { // Dialogo de aguarde ToggleLoadingDialog(); // Criar modelo CartViewModel viewModel = BuildViewModel( // Obter model do servidor  Acção Get do controlador var serverModel = GetServerModel(); id); // Gerar Client Model a partir de model do servidor cartViewModel.serverModel = ko.mapping.fromJSON( // Retornar modelo em JSON serverModel); return Json(viewModel); }
  • 24. KO JS – MVC 3 Models KO  Models MVC – Model Binding MVC 3 a partir de JSON JavaScript Model Class var cartViewModel = { public class Cart save: function() { // Validar página / modelo { … // Cart lines // Dialogo de aguarde public List<CartLine> Lines { get; set; } ToggleLoadingDialog(); } // Submeter pedido de gravação ao servidor $.ajax(ko.mapping.toJSON( public class CartLine cartViewModel.serverModel); { public string Category { get; set; } MVC Controller [HttpPost] public string Product { get; set; } public ActionResult Save(Cart cart) public int Quantity { get; set; } { public int SubTotal { get; set; } // Gravar Repository.Save(cart); } // Retornar resultado relevante da acção return Json(result); }
  • 25. KO JS – MVC 3 Elaboração de Views MVC View @model CartViewModel … // Percorrer cada linha <tbody data-bind='foreach: cartViewModel.serverModel.Lines'> … // Com o produto da linha <td class='price' data-bind='with: Product'> // Produto tem preço <span data-bind='text: formatCurrency(price)'> </span> </td> // Se a linha tiver um produto, mostrar quantidade. Incluir validações <td class='quantity'> <input name="@Html.NameFor(m => m.Product.Quantity)" data-bind='visible: product, value: quantity, valueUpdate: "afterkeydown"' @Html.ValidationAttributesFor(m => m.Product.Quantity) /> @Html.ValidationMessageFor(m => m.Product.Quantity) </td> // Se a linha tiver um produto, mostrar subtotal <td class='price'> <span data-bind='visible: product, text: formatCurrency(subtotal())' > </span> </td> // Link para remover linha de produto. Chama função do view model <td> <a href='#' data-bind='click: $parent.removeLine'>Remove</a> </td> … </tbody> … // Botões de acção. Chamam funções do view Model <button data-bind='click: addLine'>Add product</button> <button data-bind='click: save'>Submit order</button>
  • 26. Knockout JS com ASP.NET MVC 3
  • 27. Experiência de utilização O menos bom • Bugs de Model Binding de MVC • Mapping Plugin de KO e modelos grandes (Script running too long) • Execução de pedidos AJAX manualmente (GET / POST) • Performance do serializer JSON usado no MVC • Articulação com MVC Data Annotation Validations
  • 28. Experiência de Utilização O bom • Model Binding de JSON • Geração de modelos cliente a partir de modelos servidor • Mapping Plugin de KO • Data Binding e Facilidade de criação da UI no cliente • Trabalhar no cliente com objectos em vez de eventos • Facilidade de construção da aplicação • Fluidez da aplicação no cliente • Essencial para desenvolver Single Page Applications!!!!
  • 29. O futuro – MVC 4 Servidor Cliente Visible UI HTML/CSS Web UI HTML/CSS/JS Knockout.js Data Services Application Layer Navigation APIs JSON/XML JavaScript WebAPI History.js Data Access Layer UpShot.js JavaScript Local Storage HTML 5 MVC
  • 30. Conclusões • As duas tecnologias resultam bem em conjunto • Desenvolvimento mais facilitado • Aplicações mais fluidas e rápidas • Grande foco na interacção com o utilizador • Conceitos aplicam-se também fora de aplicações Web (ex: Apps para Windows 8)
  • 32. Referências ASP.NET MVC – http://www.asp.net/mvc ASP.NET MVC 4 – http://www.asp.net/mvc/mvc4 Knockout JS – http://www.knockoutjs.com Knockout JS Tutorials – http://learn.knockoutjs.com/
  • 34. Próximas reuniões presenciais • 21-04-2012 – Abril • 26-05-2012 – Maio • 02-06-2012 – Junho (Coimbra) • 16-06-2012 – Junho • 21-07-2012 – Julho Reserva estes dias na agenda! :)