client/components/ianstormtaylor/reactive/0.13.2/lib/attr-binding.js
/**
* Module dependencies.
*/
var debug = require('debug')('reactive:attr-binding');
var utils = require('./utils');
/**
* Expose `AttrBinding`.
*/
module.exports = AttrBinding;
/**
* Initialize a new attribute binding.
*
* @param {Reactive} view
* @param {Element} node
* @param {Attribute} attr
* @api private
*/
function AttrBinding(reactive, node, attr) {
var self = this;
this.reactive = reactive;
this.node = node;
this.attr = attr;
this.text = attr.value;
this.props = utils.interpolationProps(this.text);
this.subscribe();
this.render();
}
/**
* Subscribe to changes.
*/
AttrBinding.prototype.subscribe = function(){
var self = this;
var reactive = this.reactive;
this.props.forEach(function(prop){
reactive.sub(prop, function(){
self.render();
});
});
};
/**
* Render the value.
*/
AttrBinding.prototype.render = function(){
var attr = this.attr;
var text = this.text;
var reactive = this.reactive;
var model = reactive.model;
// TODO: delegate most of this to `Reactive`
debug('render %s "%s"', attr.name, text);
attr.value = utils.interpolate(text, function(prop, fn){
if (fn) {
return fn(model, reactive.view, utils.call);
} else {
return reactive.get(model, prop);
}
});
};