Skip to content

Instantly share code, notes, and snippets.

@ghempton
Created March 11, 2012 20:55
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save ghempton/2018185 to your computer and use it in GitHub Desktop.
Save ghempton/2018185 to your computer and use it in GitHub Desktop.
Ember Bound Handlebars Helper Utility
// This file contains utilities for creating bound helpers
// For reference: https://github.com/wagenet/ember.js/blob/ac66dcb8a1cbe91d736074441f853e0da474ee6e/packages/ember-handlebars/lib/views/bound_property_view.js
Ember.Handlebars.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.Handlebars.getPath(this.context, this.property, this.options), this.options.hash);
if (this.options.hash.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.Handlebars.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(GT.Handlebars.BoundHelperView, {
property: property,
propertyPaths: propertyPaths,
context: ctx,
options: options,
value: func
});
view.appendChild(bindView);
});
};
@svenfuchs
Copy link

It seems something has changed in Ember, since this.morph in line 15 is always undefined for me? any pointer?

@ghempton
Copy link
Author

Its now Ember._Metamorph. I have update the gist.

@svenfuchs
Copy link

Gotcha, just found the same. Also, it seems that with ENV.VIEW_PRESERVES_CONTEXT = true it seems to look at the wrong context?

@ghempton
Copy link
Author

ghempton commented May 14, 2012 via email

@workmanw
Copy link

@svenfuchs @ghempton I believe line 13 should be:

var value = this.value(Ember.Handlebars.getPath(this.context, this.property, this.options), this.options);

@wagenet
Copy link

wagenet commented Aug 15, 2012

GT.Handlebars.BoundHelperView should be Ember.Handlebars.BoundHelperView

@dmzza
Copy link

dmzza commented Sep 26, 2012

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment