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.

Show comment
Hide comment
@svenfuchs

svenfuchs May 14, 2012

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

svenfuchs 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.

Show comment
Hide comment
@ghempton

ghempton May 14, 2012

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

Owner

ghempton commented May 14, 2012

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

@svenfuchs

This comment has been minimized.

Show comment
Hide comment
@svenfuchs

svenfuchs 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?

svenfuchs 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.

Show comment
Hide comment
@ghempton

ghempton May 14, 2012

Owner

ghempton commented May 14, 2012

@workmanw

This comment has been minimized.

Show comment
Hide comment
@workmanw

workmanw 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);

workmanw 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.

Show comment
Hide comment
@wagenet

wagenet Aug 15, 2012

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

wagenet commented Aug 15, 2012

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

@dmzza

This comment has been minimized.

Show comment
Hide comment
@dmzza

dmzza commented Sep 26, 2012

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