6
Knockout Extender Bryan Lin 2013/11/01

Knockout extender

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Knockout extender

Knockout Extender Bryan Lin2013/11/01

Page 2: Knockout extender

Using extenders to augment observables

Knockout observables provide the basic features necessary to support reading/writing values and notifying subscribers when that value changes

Page 3: Knockout extender

Using extenders to augment observables

How to create an extenderUsing the ko.extenders object

ko.extenders.logChange = function(target, option) {    target.subscribe(function(newValue) {       console.log(option + ": " + newValue);    });    return target;};

this.firstName = ko.observable("Bob").extend({logChange: "first name"});

Page 4: Knockout extender

Using extenders to augment observables

How to create an extender View:<p><input data-bind="value: myNumberOne" /> (round to whole number)</p><p><input data-bind="value: myNumberTwo" /> (round to two decimals)</p>

Page 5: Knockout extender

ko.extenders.numeric = function(target, precision) {    //create a writeable computed observable to intercept writes to our observable    var result = ko.computed({        read: target,  //always return the original observables value        write: function(newValue) {            var current = target(),                roundingMultiplier = Math.pow(10, precision),                newValueAsNum = isNaN(newValue) ? 0 : parseFloat(+newValue),                valueToWrite = Math.round(newValueAsNum * roundingMultiplier) / roundingMultiplier;             //only write if it changed            if (valueToWrite !== current) {                target(valueToWrite);            } else {                //if the rounded value is the same, but a different value was written, force a notification for the current field                if (newValue !== current) {                    target.notifySubscribers(valueToWrite);                }            }        }    }).extend({ notify: 'always' });     //initialize with current value to make sure it is rounded appropriately    result(target());     //return the new computed observable    return result;}; function AppViewModel(one, two) {    this.myNumberOne = ko.observable(one).extend({ numeric: 0 });    this.myNumberTwo = ko.observable(two).extend({ numeric: 2 });} ko.applyBindings(new AppViewModel(221.2234, 123.4525));

Page 6: Knockout extender

References

http://knockoutjs.com/

http://jsbin.com/ahelar/49/edit