Skip to content

Commit

Permalink
Merge pull request #2312 from sebastianseilund/render-helper-with-models
Browse files Browse the repository at this point in the history
Fix for using {{render}} with same template multiple times
  • Loading branch information
tomdale committed Mar 28, 2013
2 parents 8a4e6af + 0774f3c commit 2cf2548
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 29 deletions.
4 changes: 2 additions & 2 deletions packages/ember-routing/lib/helpers/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
container = options.data.keywords.controller.container;
router = container.lookup('router:main');

Ember.assert("This view is already rendered", !router || !router._lookupActiveView(name));
Ember.assert("You can only use the {{render}} helper once without a model object as its second argument, as in {{render \"post\" post}}.", context || !router || !router._lookupActiveView(name));

view = container.lookup('view:' + name) || container.lookup('view:default');

Expand Down Expand Up @@ -72,7 +72,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
options.hash.template = container.lookup('template:' + name);
options.hash.controller = controller;

if (router && !contextString) {
if (router && !context) {
router._connectActiveView(name, view);
}

Expand Down
108 changes: 81 additions & 27 deletions packages/ember-routing/tests/helpers/render_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,32 +121,6 @@ test("{{render}} helper should render given template with a supplied model", fun
deepEqual(postController.get('model'), { title: "Rails is unagi" });
});


test("{{render}} helper should not use singleton controller with a supplied model", function() {
var template = "<h1>HI</h1>{{render 'post' post}}{{render 'post' post}}";
var post = {
title: 'Rails is omakase'
};

var Controller = Ember.Controller.extend({
container: container,
post: post
});

var controller = Controller.create();

view = Ember.View.create({
controller: controller,
template: Ember.Handlebars.compile(template)
});

Ember.TEMPLATES['post'] = compile('<p>{{title}}</p>');

appendView(view);

equal(view.$().text(), 'HIRails is omakaseRails is omakase');
});

test("{{render}} helper should render with given controller", function() {
var template = '<h1>HI</h1>{{render home controller="posts"}}';
var controller = Ember.Controller.extend({container: container});
Expand All @@ -164,7 +138,7 @@ test("{{render}} helper should render with given controller", function() {
equal(container.lookup('controller:posts'), renderedView.get('controller'), 'rendered with correct controller');
});

test("{{render}} helper should render a template only once", function() {
test("{{render}} helper should render a template without a model only once", function() {
var template = "<h1>HI</h1>{{render home}}<hr/>{{render home}}";
var controller = Ember.Controller.extend({container: container});
view = Ember.View.create({
Expand All @@ -179,6 +153,86 @@ test("{{render}} helper should render a template only once", function() {
}, 'should raise an exception');
});

test("{{render}} helper should render templates with models multiple times", function() {
var template = "<h1>HI</h1> {{render 'post' post1}} {{render 'post' post2}}";
var post1 = {
title: "Me first"
};
var post2 = {
title: "Then me"
};

var Controller = Ember.Controller.extend({
container: container,
post1: post1,
post2: post2
});

var controller = Controller.create();

view = Ember.View.create({
controller: controller,
template: Ember.Handlebars.compile(template)
});

var PostController = Ember.ObjectController.extend();
container.register('controller', 'post', PostController, {singleton: false});

Ember.TEMPLATES['post'] = compile("<p>{{title}}</p>");

appendView(view);

var postController1 = view.get('_childViews')[0].get('controller');
var postController2 = view.get('_childViews')[1].get('controller');

equal(view.$().text(), 'HI Me first Then me');
equal(postController1.get('model'), post1);
equal(postController2.get('model'), post2);

set(controller, 'post1', { title: "I am new" });

equal(view.$().text(), 'HI I am new Then me');
deepEqual(postController1.get('model'), { title: "I am new" });
});

test("{{render}} helper should render templates both with and without models", function() {
var template = "<h1>HI</h1> {{render 'post'}} {{render 'post' post}}";
var post = {
title: "Rails is omakase"
};

var Controller = Ember.Controller.extend({
container: container,
post: post
});

var controller = Controller.create();

view = Ember.View.create({
controller: controller,
template: Ember.Handlebars.compile(template)
});

var PostController = Ember.ObjectController.extend();
container.register('controller', 'post', PostController, {singleton: false});

Ember.TEMPLATES['post'] = compile("<p>Title:{{title}}</p>");

appendView(view);

var postController1 = view.get('_childViews')[0].get('controller');
var postController2 = view.get('_childViews')[1].get('controller');

equal(view.$().text(), 'HI Title: Title:Rails is omakase');
equal(postController1.get('model'), null);
equal(postController2.get('model'), post);

set(controller, 'post', { title: "Rails is unagi" });

equal(view.$().text(), 'HI Title: Title:Rails is unagi');
deepEqual(postController2.get('model'), { title: "Rails is unagi" });
});

test("{{render}} helper should link child controllers to the parent controller", function() {
var parentTriggered = 0;

Expand Down

0 comments on commit 2cf2548

Please sign in to comment.