20140520 microsoft webcamp - databinding with knockoutjs

43
Data Binding com Microsoft WebCamp 2014 20 de Maio de 2014

Upload: joao-martins

Post on 27-Nov-2014

314 views

Category:

Software


0 download

DESCRIPTION

Level 250-300 session on KnockoutJS, with 10 examples. Full code at my blog: http://blogit.create.pt/blogs/joaopedromartins Note: in portuguese.

TRANSCRIPT

Page 1: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Data Binding com

Microsoft WebCamp 201420 de Maio de 2014

Page 2: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

2 /43

Sobre mim

João Pedro “jota” MartinsCTO

[email protected]

@lokijota

http://blogit.create.pt/blogs/joaomartins

http://www.linkedin.com/in/joaopedromartins

Page 3: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

3 /43

Agenda

O que é KnockoutJS? Observables Computed Members Observable Arrays Bindings nativos Templates e controlo de fluxo Extensão de Binding Handlers Temas relâmpago: Mapping Plugin, Extenders, KoUtils, Debug/troubleshooting

Page 4: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

4 /43

O que é KnockoutJS?

Biblioteca Javascript que ajuda na criação de interfaces dinâmicos sobre um modelo de dados limpo, usando MVVM.

Por outras palavras: é uma framework Javascript de data binding para aplicações Web.

ELEVATOR PITCH

Page 5: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

5 /43

Apresentação rápida

Grátis e open source, criado em 2010 por Steve Sanderson Javascript puro – funciona com outras frameworks , server ou client-side Compacto - 47kb ‘minificado’ (~13kb usando gzip) Sem dependências (jQuery opcional, p.ex.) Suporta [praticamente] todos os browsers IE 6+ (!!), Firefox 2+, Chrome, Opera, Safari (desktop/mobile)

Completamente documentado e com comunidade activa Documentação da API, exemplos funcionais, tutoriais interactivos, blogs, Google Group

Versão actual: 3.1.0 e grande foco em retro-compatibilidade

O QUE É KNOCKOUTJS?

6+ 2+

Page 6: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

6 /43

Funcionalidades

Bindings declarativos Associação de elementos do DOM a um modelo em Javascript com uma

sintaxe concise e legível Actualização automática do Interface Utilizador e Modelo Sempre que o modelo muda, o IU é actualizado (e vice-versa)

Gestão de dependências Identificação implícita de dependências entre campos do modelo

Templating Geração de interfaces com base nos dados do modelo

O QUE É KNOCKOUTJS?

Page 7: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

/437MVVMO QUE É KNOCKOUTJS?

MODEL

Server/DB Javascript+Observables HTML + Bindings

VIEWVIEW MODEL AUTO

User Interface em HTML

Backend de lógica e dados, pode ser qualquer tecnologia

Modelo OO do User Interface, com dados e lógica da UI

Dados e acções

Page 8: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

/438Javascript Brothers in Arms

jQuerySubstituto cross-browser para uma API inconsistente do DOM

Mecanismo baixo nível de manipular elementos e event handlers em páginas Web

AngularJSFramework completa alto-nível para desenvolvimento de Single Page Applications (SPA)

Comparável a Durandal

KnockoutJSFramework alto-nível para mapeamento entre modelos de dados e interfaces Web, usando padrão MVVM

KOJS usa jQuery se estiver disponível

O QUE NÃO É KNOCKOUTJS?

Page 9: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

9 /43

KnockoutJS em 3 passos

<input data-bind="value: firstName" />

O QUE É KNOCKOUTJS?

Binding declarativ

o

var myViewModel = {firstName: ko.observable(“jota")

};

ko.applyBindings(myViewModel);

Criar observabl

e

Ligar (bind) do ViewModel à View

Page 10: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

KOJS 101DEMO 01

Page 11: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

11 /43

Sagan

Carl SaganCarl Sagan

Sagan

Target Element Binding Source Object Property

Observables

Encapsular propriedades com a função “observable” ko.observable() ou ko.observable(valor_inicial);

Binding bi-direccional Tanto UI como modelo são actualizados

CONCEITOS BASE

Page 12: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

12 /43

Binding bi-direccionalCONCEITOS BASE

<span>Laptop model:</span><input data-bind="value: product.model"/><span>Sales price:</span><span data-bind="text: product.salePrice"></span>

Binding declarativ

o

product: { id: 1001, model: ko.observable(“Surface 2 Pro"), salePrice: ko.observable(1199.95) } ko.applyBindings(product);

Objecto de dados

Ligar UI a dados e vice-versa (wireup)

Page 13: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

ObservablesDEMO 02

Page 14: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

14 /43

Membros calculados - Computed

Definir uma função que define um valor, e usar isso no binding Ex: Nome completo, Photo Url, Montantes totais

Quando os observables são alterados, os campos computed também são notificados – detecção implícita de dependências

Gestão de “this”… Pode ser necessário passar informação sobre o “this” para o computed

CONCEITOS BASE

Page 15: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

15 /43

Definir uma propriedade Computed

vm = {id: ko.observable(1),unitPrice: ko.observable(4199),qty: ko.observable(2)

};

vm.extendedPrice = ko.computed(function () { return this.product() ?

this. unitPrice() * parseInt("0" + this.qty(), 10) : 0; }, vm);

CONCEITOS BASE

observables

Owner (=this)

Page 16: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Computed ObservablesDEMO 03

Page 17: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

17 /43

Observable Array

Permite ‘seguir’ os itens de um array, não o seu estado interno Notificações geradas quando itens são Adicionados ou Removidos do

Array Suporta API normais sobre arrays (push, pop, length, …) Não são geradas notificações quando as propriedades de itens do

array são alterados Necessário usar ko.observable() nessas propriedades também

CONCEITOS BASE

Page 18: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

18 /43

Exemplo de Observable ArrayCONCEITOS BASE

var myViewModel = {salesPerson: ko.observable(“Luis Calado"),empNum: ko.observable(666),products: ko.observableArray([ { model: “Surface Pro", price: 1749,

id=123 },{ model: “Windows Azure", price: 189,

id=456 }])

};

<span data-bind="text: products().length"></span>

Pré-popular com dados

Agir sobre o observable

array

Page 19: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Observable ArrayDEMO 04

Page 20: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

20 /43

Bindings

<input type="text" data-bind="enable: allowEditing, value: salePrice" />

<select data-bind="options: colors, value: selectedColor, optionsText: 'name', optionsValue: 'key'" ></select>

CONCEITOS BASE

Nativos de Knockout

Binding a atributos de elementos

Vários bindings num elemento

Page 21: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

21 /43

Bindings nativos (2)CONCEITOS BASE

attr checked click css disable

enable event hasfocus html options

optionsText optionsValue selectedOptions style submit

text uniqueName value visibletext value

click disable

enable

attr

Display and state bindingsText and value bindingsBindings for specific attributes

visible

event

Event bindings

Page 22: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Bindings nativosDEMO 05

Page 23: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

/4323Templates: control de fluxoCONCEITOS BÁSICOS

• Se condição “truthy”if• Se condição “falsy”ifnot

• Executar para cada item numa listaforeach• Especificar sub-scope do viewModelwith

Page 24: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

24 /43

Templates – inline templates

<tbody data-bind="foreach: lines"><tr>

<td style="width: 100px;"><input data-bind="value: quantity" />

</td> ...</tr>

</tbody>

CONCEITOS BÁSICOS

Page 25: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

25 /43

Templates – named templates

<tbody data-bind="template: {name: 'productsTmpl', foreach: lines}"></tbody>

<script type="text/html" id="productsTmpl"> <tr> <td style="width: 100px;">

<input data-bind="value: quantity" /> </td> ...</tr>

</script>

CONCEITOS BÁSICOS

Passar o contexto para a template com o “foreach”

Page 26: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

26 /43

Condições

<p data-bind="if: lines().length > 0"><span>Total value:</span><span data-bind="text: grandTotal()"></span>

</p>

CONCEITOS BÁSICOS

Qualquer expressão “truthy”

Page 27: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Especificar o contexto

<div data-bind="with: model"> <div data-bind="text: brand"></div><div data-bind="text: name"></div>

</div>

<div> <div data-bind="text: model().brand"></div><div data-bind="text: model().name"></div>

</div>

CONCEITOS BÁSICOS

Page 28: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Controlo de fluxo e templates (foreach)DEMO 06

Page 29: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

29 /43

Controlo de fluxo sem container HTML

Utilização de comentários HTML Comentário usa elementos de control de fluxo if ifnot foreach with Template

<!-- ko foreach: myItems --> …<!-- /ko -->

CONCEITOS BÁSICOS

Parte do motor de templating nativo

do KnockoutJS

Page 30: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Controlo de fluxo sem containerDEMO 07

Page 31: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

31 /43

O que são Custom Binding Handlers?

Mecanismo de extensibilidade de bindings

Exemplos Arredondar e apresentar como valor monetário Animar uma transição

fadeVisible Integrar com jQueryUI

jqButton Ratings com estrelas

starRating Fazer logging

CONCEITOS BASE

Page 32: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

32 /43

Como criar um Binding Handler

ko.bindingHandlers.fadeVisible = { init: function(element, valueAccessor) { // ...

},

update: function(element, valueAccessor) { // ...

} }

CONCEITOS BASE

Executado na primeira avaliação do binding

Executado depois do init, cada vez que um dos

observables mude

Page 33: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Binding Handler - parâmetros

ko.bindingHandlers.fadeVisible = { init: function(element, valueAccessor, allBindingsAccessor, viewModel) { var shouldDisplay = valueAccessor(); $(element).toggle(shouldDisplay); }, update: function(element, valueAccessor, allBindingsAccessor, viewModel) { var shouldDisplay = valueAccessor(); shouldDisplay ? $(element).fadeIn() : $(element).fadeOut(); } }

Elemento do DOM

Parâmetro binding

Outros bindings do elemento

viewmodel

Page 34: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Custom Binding HandlersDEMO 08

Page 35: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

35 /43

Mapping

Mapping Plugin Extensão ao Knockout (download oficial separado) Converte um objecto JS para um objecto observável, recursivamente Possibilidade de parametrizar operação ko.mapping.fromJS(jsdata) e ko.mapping.toJS(viewModel);

Pode ter problemas de desempenho. Alternativa: Knockout Wrap

OUTROS TEMAS

Page 36: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

36 /43

Extenders

Permitem adicionar funcionalidade extra aos nossos observables que filtram a forma como notificações são geradas

Ex. de nativos: myViewModel.personName.extend({ rateLimit: 50 }); // limita taxa de eventos myViewModel.personName.extend({ notify: 'always' }); // força sync

Ex. de desenvolvidos à medida: this.firstName = ko.observable(“jota").extend({logChange: "first name"});

OUTROS TEMAS

Page 37: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

37 /43

KO Utils

Despistar dados usados para fazer bind com um elemento: ko.dataFor(element) – dados com que o element foi ‘binded’ ko.contextFor(element) – todo o ‘binding context’ disponível para o element DOM

ko.toJS – cria cópia de um viewModel removendo toda a estrutura do KO ko.toJSON – chama toJS e depois converte o resultado para JSON

JSON.stringify(viewModel) ignora funções, e observables são funções… ko.utils.parseJSON(str) – semelhante a JSON.parse. A seguir implica usar mapping plugin ko.utils.arrayMap(str, delegate) – itera num array e aplica um delegate(semelhante a lambda), devolvendo

colecçãovar mappedData = ko.utils.arrayMap(jsonData, function(item) { return new Item(item.name, item.category, item.price);});

ko.utils.arrayForEach(val, delegate) – itera num array e aplica um delegate ko.utils.arrayFilter(val, boolDelegate) – filtra array

OUTROS TEMAS

Page 38: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

38 /43

Debug e Troubleshooting

<pre data-bind=“text: ko.toJSON($data, 0, 2)”></pre>

<input data-bind=“uniqueIName: console.log($data), value: description />

Knockout Context Debugger (chrome extension) e dev-console do browser

Performance – quantas vezes dispara um binding? Apenas deve ser observable o que dever ter fluxo bi-direccional

OUTROS TEMAS

Page 39: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Just one more demoDEMO 09

Page 40: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

40 /43

Resumindo – KnockoutJS é uma biblioteca…

Específica e pequenaCompatível com vários browsers e outras frameworks

Permite sincronização automática da alterações e suporta melhor estruturação de código Javascript

Page 41: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

41 /43

Horas de diversão

Documentação e Download Homepage e documentação: http://knockoutjs.com Blog Steve Sanderson: http://blog.stevensanderson.com Blog Ryan Niemeyer: http://knockmeout.net Código: https://github.com/knockout/knockout/releases

Extras e extensões Knockout Validation: https://github.com/Knockout-Contrib/Knockout-Validation Knockout Wrap: https://github.com/arj03/knockout.wrap Knockout-es5: https://github.com/SteveSanderson/knockout-es5 Knockout Delegated Events: https://github.com/rniemeyer/knockout-delegatedEvents Google Chrome Extension: Knockoutjs context debugger

Comunidade https://groups.google.com/forum/#!forum/knockoutjs http://stackoverflow.com “knockoutjs”

Page 42: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS

Obrigado!

[email protected]

@lokijota

http://blogit.create.pt/blogs/joaomartins

http://www.linkedin.com/in/joaopedromartins

Page 43: 20140520 Microsoft WebCamp - DataBinding with KnockoutJS