21
Custom Binding Handlers and Persisting Data John Papa @john_papa http://johnpapa.net

Knockout mvvm-m6-slides

Embed Size (px)

DESCRIPTION

Playlists : https://www.youtube.com/watch?v=xm0cCOdupjM&list=PLLQgkMVoGtcu8zEdwDHls62jrqgPTbtiE&index=2

Citation preview

Page 1: Knockout mvvm-m6-slides

Custom Binding Handlers and Persisting Data

John Papa @john_papa

http://johnpapa.net

Page 2: Knockout mvvm-m6-slides

Outline

Custom Binding Handlers Unobtrusive JavaScript Saving/Loading Data Change Tracking Mapping

Page 3: Knockout mvvm-m6-slides

What Are Custom Binding Handlers?

Just another binding Can’t find the right built-in binding? Make your own!

Examples Animate a transition for an item

fadeVisible

Integrate with jQuery UI

jqButton

Get creative starRating

Page 4: Knockout mvvm-m6-slides

init and update

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

Runs the first time the binding is eval’d

After init, and every time one of its observables

changes

Page 5: Knockout mvvm-m6-slides

Parameters

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(); } }

The overall view model

All other bindings in the same data-bind attribute

What is passed to the binding

The bound element in the

DOM

Page 6: Knockout mvvm-m6-slides

DEMO

Custom Binding Handlers

Page 7: Knockout mvvm-m6-slides

Outline

Custom Binding Handlers Unobtrusive JavaScript Saving/Loading Data Change Tracking Mapping

Page 8: Knockout mvvm-m6-slides

Unobtrusive Event Handlers and Helpers

//In the view model removeProduct = function (p) { products.remove(p); }

<div class="closeIcon" data-bind="click:$parent.removeProduct"></div>

var itemSelector = "ul li"; $(itemSelector).on("click", "div.closeIcon", function () { my.vm.removeProduct(ko.dataFor(this)); });

<div class="closeIcon"></div>

data available for binding on the element

Page 9: Knockout mvvm-m6-slides

Unobtrusive JavaScript: Binding Mappings

$("#total").attr("data-bind","value: grandTotal"); $("#total").attr("data-bind","css: {hilite: metGoal}");

Move data-bind to JavaScript/jQuery

Page 10: Knockout mvvm-m6-slides

DEMO

Unobtrusive JavaScript Events

Page 11: Knockout mvvm-m6-slides

Outline

Custom Binding Handlers Unobtrusive JavaScript Saving/Loading Data Change Tracking Mapping

Page 12: Knockout mvvm-m6-slides

Loading / Saving Data

Add Controller Simple load and save methods

Add Models Add

papa.ajaxservice.js dataservice.js

Page 13: Knockout mvvm-m6-slides

DEMO

Saving / Loading Data

Page 14: Knockout mvvm-m6-slides

Outline

Custom Binding Handlers Unobtrusive JavaScript Saving/Loading Data Change Tracking Mapping

Page 15: Knockout mvvm-m6-slides

Change Tracking

vm.tracker = new ChangeTracker(viewModel); // Did It Change? vm.tracker().somethingHasChanged(); // Hook this into your view model functions // (ex: load, save) ... // Resync Changes vm.tracker().markCurrentStateAsClean;

Page 16: Knockout mvvm-m6-slides

DEMO

Change Tracking

Page 17: Knockout mvvm-m6-slides

Outline

Custom Binding Handlers Unobtrusive JavaScript Saving/Loading Data Change Tracking Mapping

Page 18: Knockout mvvm-m6-slides

Mapping JSON to Objects

Creating observables can be monotonous Especially …

Ajax to fetch data and return JSON

Knockout JS Mapper

Community created plug in

Map Converts JSON to an object with observables

Unmap Converts mapped object back to a regular JavaScript object

Page 19: Knockout mvvm-m6-slides

Mapping

save = function () { var person = ko.mapping.toJSON(model()); my.PersonSvc.savePerson( person, function (result) { // ... } ); };

load = function () { my.PersonSvc.getPersons( function (result) { model(ko.mapping.fromJS(result)); } ); };

Page 20: Knockout mvvm-m6-slides

Summary

Custom Binding Handlers Unobtrusive JavaScript Saving/Loading Data Change Tracking Mapping

Page 21: Knockout mvvm-m6-slides

For more in-depth online developer training visit

on-demand content from authors you trust