/*
ractive-adaptors-bacon
======================
Version 0.1.0.
Bacon.js adaptor for Ractive
==========================
Troubleshooting: If you're using a module system in your app (AMD or
something more nodey) then you may need to change the paths below,
where it says `require( 'ractive' )` or `define([ 'ractive' ]...)`.
==========================
Usage: Include this file on your page below Ractive, e.g:
Or, if you're using a module loader, require this module:
// requiring the plugin will 'activate' it - no need to use
// the return value
require( 'ractive-adaptors-bacon' );
Then, tell Ractive to use the `Bacon` adaptor:
ractive = new Ractive({
el: 'body',
template: myTemplate,
adapt: 'Bacon',
data: {
foo: someReactiveProperty
}
});
*/
(function ( global, factory ) {
'use strict';
// Common JS (i.e. browserify) environment
if ( typeof module !== 'undefined' && module.exports && typeof require === 'function' ) {
factory( require( 'ractive', 'bacon' ) );
}
// AMD?
else if ( typeof define === 'function' && define.amd ) {
define([ 'ractive', 'bacon' ], factory );
}
// browser global
else if ( global.Ractive && global.Bacon ) {
factory( global.Ractive, global.Bacon );
}
else {
throw new Error( 'Could not find Ractive and Bacon! They must be loaded before the ractive-adaptors-bacon plugin' );
}
}( typeof window !== 'undefined' ? window : this, function ( Ractive, Bacon ) {
'use strict';
var BaconWrapper = function ( ractive, observable, keypath ) {
var self = this;
this.ractive = ractive;
this.value = observable;
this.keypath = keypath;
this.dispose = observable.subscribe( function ( observable ) {
var value;
if ( self.updating ) {
return;
}
value = observable.value();
self._value = value;
self.updating = true;
ractive.set( keypath, value );
self.updating = false;
});
};
BaconWrapper.prototype = {
get: function () {
return this._value;
},
teardown: function () {
this.dispose();
},
reset: function ( value ) {
if ( this.updating ) {
return;
}
if ( value instanceof Bacon.Observable ) {
return false;
}
this.updating = true;
// TODO how do you set the value of a Bacon.Observable?!
this.updating = false;
}
};
Ractive.adaptors.Bacon = {
filter: function ( object ) {
return object instanceof Bacon.Observable;
},
wrap: function ( ractive, observable, keypath ) {
return new BaconWrapper( ractive, observable, keypath );
}
};
}));