From 0774f3c43a8ea78455a14efc32fdbc9902d8ec9c Mon Sep 17 00:00:00 2001 From: Sebastian Seilund Date: Wed, 20 Mar 2013 14:49:09 -0700 Subject: [PATCH] Actions should be unregistered when destroying virtual views --- packages/ember-routing/lib/helpers/render.js | 4 +- .../tests/helpers/render_test.js | 108 +++++++++++++----- 2 files changed, 83 insertions(+), 29 deletions(-) diff --git a/packages/ember-routing/lib/helpers/render.js b/packages/ember-routing/lib/helpers/render.js index eb8838e8d0a..06aeeedcbe1 100644 --- a/packages/ember-routing/lib/helpers/render.js +++ b/packages/ember-routing/lib/helpers/render.js @@ -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'); @@ -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); } diff --git a/packages/ember-routing/tests/helpers/render_test.js b/packages/ember-routing/tests/helpers/render_test.js index c76a78596df..61ba91ebc64 100644 --- a/packages/ember-routing/tests/helpers/render_test.js +++ b/packages/ember-routing/tests/helpers/render_test.js @@ -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 = "

HI

{{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('

{{title}}

'); - - appendView(view); - - equal(view.$().text(), 'HIRails is omakaseRails is omakase'); -}); - test("{{render}} helper should render with given controller", function() { var template = '

HI

{{render home controller="posts"}}'; var controller = Ember.Controller.extend({container: container}); @@ -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 = "

HI

{{render home}}
{{render home}}"; var controller = Ember.Controller.extend({container: container}); view = Ember.View.create({ @@ -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 = "

HI

{{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("

{{title}}

"); + + 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 = "

HI

{{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("

Title:{{title}}

"); + + 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;