// https://gist.github.com/2018185 // For reference: https://github.com/wagenet/ember.js/blob/ac66dcb8a1cbe91d736074441f853e0da474ee6e/packages/ember-handlebars/lib/views/bound_property_view.js var BoundHelperView = Ember.View.extend(Ember._Metamorph, { context: null, options: null, property: null, // paths of the property that are also observed propertyPaths: [], value: Ember.K, valueForRender: function() { var value = this.value(Ember.get(this.context, this.property), this.options); if (this.options.escaped) { value = Handlebars.Utils.escapeExpression(value); } return value; }, render: function(buffer) { buffer.push(this.valueForRender()); }, valueDidChange: function() { if (this.morph.isRemoved()) { return; } this.morph.html(this.valueForRender()); }, didInsertElement: function() { this.valueDidChange(); }, init: function() { this._super(); Ember.addObserver(this.context, this.property, this, 'valueDidChange'); this.get('propertyPaths').forEach(function(propName) { Ember.addObserver(this.context, this.property + '.' + propName, this, 'valueDidChange'); }, this); }, destroy: function() { Ember.removeObserver(this.context, this.property, this, 'valueDidChange'); this.get('propertyPaths').forEach(function(propName) { this.context.removeObserver(this.property + '.' + propName, this, 'valueDidChange'); }, this); this._super(); } }); Ember.registerBoundHelper = function(name, func) { var propertyPaths = Array.prototype.slice.call(arguments, 2); Ember.Handlebars.registerHelper(name, function(property, options) { var data = options.data, view = data.view, ctx = this; var bindView = view.createChildView(BoundHelperView, { property: property, propertyPaths: propertyPaths, context: ctx, options: options.hash, value: func }); view.appendChild(bindView); }); };