Client side development with knockout.js

42

description

 

Transcript of Client side development with knockout.js

Page 1: Client side development with knockout.js
Page 2: Client side development with knockout.js

Valdis Iljuconoks

Technical Fellow, Software ArchitectVisual Studio ALM evangelistMicrosoft MVP

http://www.tech-fellow.lv | @tech_fellow

Geta AS, Tech Fellow Consulting, Latvian .Net [email protected]

Page 3: Client side development with knockout.js

knockout.js

Page 4: Client side development with knockout.js

$(function () { $("#btn").click(function () { $.getJSON("/api/customers").then(function (customers) { $.each(customers, function () { $("<li>").text(this.FirstName + " " + this.LastName).appendTo("#customers"); }); }); });});

Page 5: Client side development with knockout.js

$(function () { $("#btn").click(function () { $.getJSON("/api/customers").then(function (customers) { var html = tmpl("cust_tmpl", { customers: customers }); $("#customers").html(html); }); });});

<script type="text/html" id="cust_tmpl"> {{each customers}} <li><a href="/api/customer/${Id}">${FirstName} ${LastName}</a></li> {{/each}}</script>

Page 6: Client side development with knockout.js
Page 7: Client side development with knockout.js

ObservablesBindingsUtilities

Data featuresPlug-ins

Page 8: Client side development with knockout.js

Observables

Page 9: Client side development with knockout.js

ObservableObservable Array

Dependent Observables (Computed)

Page 10: Client side development with knockout.js

ObservablesFunctions (not all browsers support getters and setters)

// read valuevar val = viewmodel.name();

// set valueviewmodel.name(“Valdis”)

Page 11: Client side development with knockout.js

Observable ArrayUse with collections

Detect changes only within an arrayUse knockout array methods (cross-browser)

viewmodel.customers = ko.obserableArray();

viewmodel.customers.push(new customer());

Page 12: Client side development with knockout.js

indexOf(item)slice(2, 4)push(item)

pop()unshift(item)

shift()reverse()

sort()remove(item)removeAll()

Page 13: Client side development with knockout.js

Dependent Observables (Computed)“this” keyword has to be managed

viewmodel.fullname = ko.computed(function() { return this.name() + “ ” + this.surname();})

Page 14: Client side development with knockout.js

ObservablesBindingsUtilities

Data featuresPlug-ins

Page 15: Client side development with knockout.js

Bindings

Page 16: Client side development with knockout.js

Built-in BindingsControl-flow bindings

Custom bindings

Page 17: Client side development with knockout.js

Built-in BindingsControl-flow bindings

Custom bindings

Page 18: Client side development with knockout.js

data-bind=“”

value:html:text:css:

style:visible:

template:…

Page 19: Client side development with knockout.js

Built-in BindingsControl-flow bindings

Custom bindings

Page 20: Client side development with knockout.js

data-bind=“”

foreach:if:

ifnot:with:

Page 21: Client side development with knockout.js

Built-in BindingsControl-flow bindings

Custom bindings(most powerful extension point)

Page 22: Client side development with knockout.js

Event binding

Page 23: Client side development with knockout.js

addOnEnter: function(model, event) { var keycode = (event.which ? event.which : event.keyCode); if (keycode === 13) { viewModel.addTCustomer(); }

return true;}

data-bind=“event: {keypress: addOnEnter}”

Page 24: Client side development with knockout.js

Custom binding

Page 25: Client side development with knockout.js

Custom bindingsDefine your own behavior

ko.bindingHandlers.yourBindingName = { init: update:}

Page 26: Client side development with knockout.js

ko.bindingHandlers.executeOnEnter = { init: function(element, valueAccessor, allBindingAccessor, viewModel) { var value = valueAccessor(); $(element).keypress(function(event) { var keycode = (event.which ? event.which : event.keyCode); if (keycode === 13) { value.call(viewModel); return false; }

return true; }); }};

data-bind=“executeOnEnter: addCustomer”

Page 27: Client side development with knockout.js

ObservablesBindingsUtilities

Data featuresPlug-ins

Page 28: Client side development with knockout.js

Utilities

Page 29: Client side development with knockout.js

ko.utils.arrayFilter()

Page 30: Client side development with knockout.js

ko.utils.arrayFilter()ko.utils.arrayFirst()

ko.utils.arrayForEach()ko.utils.arrayIndexOf()

ko.utils.arrayMap()ko.utils.compareArrays()

ko.utils.unwrapObservable()…

Page 31: Client side development with knockout.js

ObservablesBindingsUtilities

Data featuresPlug-ins

Page 32: Client side development with knockout.js

Data features

Page 33: Client side development with knockout.js

ko.toJS()ko.toJSON()

Page 34: Client side development with knockout.js

ObservablesBindingsUtilities

Data featuresPlug-ins

Page 35: Client side development with knockout.js

Plug-ins

Page 36: Client side development with knockout.js

ko.mapping.*

Page 37: Client side development with knockout.js

ObservablesBindingsUtilities

Data featuresPlug-ins

Page 38: Client side development with knockout.js

Resources

Page 39: Client side development with knockout.js

knockoutjs.comblog.stevensanderson.com

knockmeout.comstackoverflow.com -> “knockoutjs”groups.google.com -> “knockoutjs”

Page 40: Client side development with knockout.js

nice to haveto build interactive UI

Page 41: Client side development with knockout.js

?

Page 42: Client side development with knockout.js

Valdis Iljuconoks

Technical Fellow, Software ArchitectVisual Studio ALM evangelistMicrosoft MVP

http://www.tech-fellow.lv | @tech_fellow

Geta AS, Tech Fellow Consulting, Latvian .Net [email protected]