Skip to content

Instantly share code, notes, and snippets.

@anasnakawa
Last active December 28, 2015 23:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anasnakawa/7579889 to your computer and use it in GitHub Desktop.
Save anasnakawa/7579889 to your computer and use it in GitHub Desktop.
extending knockout observables, to be easily resetted.
// adding default value when initializing an observable
// for later resetting, preventing the observable from
// becoming undefined ( still you can set it to `null` )
// ====================================================
// example[1]: primitive types ( passed by value )
// -----------------------------------------------
// var username = ko.observable().default( 'guest' );
// username(); // 'guest'
// username( 'admin' ); // 'admin'
// username( undefined ); // 'guest'
// username( 'john doe' ); // 'john doe'
// username.reset(); // 'guest'
//
// example[2]: non-premitive types ( passed by reference )
// -------------------------------------------------------
// var userList = ko.observableArray([]).default(function() { return []; });
// var settings = ko.observable().default(function() { return { foo: 'bar' } });
// userList.reset();
// settings.reset();
ko.observable.prototype.reset = function() {
this( typeof this._default === 'function' ? this._default() : this._default );
}
// * **param:** {object|factory}
ko.observable.prototype.default = function( value ) {
if( typeof value === 'undefined' ) {
return;
}
// store default value
this._default = value;
// observable defined with no arguments
// use default
if( typeof this() === 'undefined' ) {
this.reset();
}
// whenever value changed to undefined, reset to default
this.subscribe(function( newValue ) {
typeof newValue === 'undefined' && this.reset();
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment