Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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

This comment has been minimized.

Copy link

commented May 14, 2012

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

@ghempton

This comment has been minimized.

Copy link
Owner Author

commented May 14, 2012

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

@svenfuchs

This comment has been minimized.

Copy link

commented May 14, 2012

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

@ghempton

This comment has been minimized.

Copy link
Owner Author

commented May 14, 2012

@workmanw

This comment has been minimized.

Copy link

commented Jun 29, 2012

@svenfuchs @ghempton I believe line 13 should be:

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

This comment has been minimized.

Copy link

commented Aug 15, 2012

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

@dmzza

This comment has been minimized.

Copy link

commented Sep 26, 2012

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.