sc_require('ext/handlebars');
SC
.Handlebars.ViewHelper = SC
.Object.create({
helper: function(thisContext, path, options) { var inverse = options.inverse; var data = options.data; var view = data.view; var fn = options.fn; var hash = options.hash; var newView; if (path.isClass || path.isObject) { newView = path; if (!newView) { throw new Error("Null or undefined object was passed to the #view helper. Did you mean to pass a property path string?"); } } else { // Path is relative, look it up with this view as the root if (path.charAt(0) === '.') { newView = SC.objectForPropertyPath(path.slice(1), view); } else { // Path is absolute, look up path on global (window) object newView = SC.getPath(thisContext, path); if (!newView) { newView = SC.getPath(path); } } if (!newView) { throw new Error("Unable to find view at path '" + path + "'"); } } if (hash.id) { hash.layerId = hash.id; } else if (path.id) { hash.id = hash.layerId = path.id; } var contextOptions = { 'id': hash.id, 'class': hash['class'], 'classBinding': hash.classBinding }; delete hash.id; delete hash['class']; delete hash.classBinding; if (newView.isClass) { newView = newView.extend(hash); } else { SC.mixin(newView, hash); } var currentView = data.view; var childViews = currentView.get('childViews'); var childView = currentView.createChildView(newView); // Set the template of the view to the passed block if we got one if (fn) { childView.template = fn; } childViews.pushObject(childView); var context = SC.RenderContext(childView.get('tagName')); // Add id and class names passed to view helper this.applyAttributes(contextOptions, childView, context); // tomdale wants to make SproutCore slow childView.renderToContext(context); return new Handlebars.SafeString(context.join()); }, applyAttributes: function(options, childView, context) { var id = options.id; var classNames = options['class']; if (classNames) { context.addClass(classNames.split(' ')); } if (id) { childView.set('layerId', id); context.id(id); } var classBindings = options.classBinding; if (classBindings) { SC.Handlebars.bindClasses(childView, classBindings, childView).forEach(function(className) { context.setClass(className, YES); }); } }
});
Handlebars.registerHelper('view', function(path, options) {
return SC.Handlebars.ViewHelper.helper(this, path, options);
});