diff --git a/packages/ember-routing-htmlbars/lib/helpers/render.js b/packages/ember-routing-htmlbars/lib/helpers/render.js index 3a9ed2a888b..3174877e820 100644 --- a/packages/ember-routing-htmlbars/lib/helpers/render.js +++ b/packages/ember-routing-htmlbars/lib/helpers/render.js @@ -211,6 +211,13 @@ function impersonateAnOutlet(currentView, view, name) { view._isOutlet = true; view._outletName = '__ember_orphans__'; view._matchOutletName = name; + view._parentOutlet = function() { + var parent = this._parentView; + while (parent && !parent._isOutlet) { + parent = parent._parentView; + } + return parent; + }; view.setOutletState = function(state) { var ownState; if (state && (ownState = state.outlets[this._matchOutletName])) { diff --git a/packages/ember-routing-htmlbars/tests/helpers/render_test.js b/packages/ember-routing-htmlbars/tests/helpers/render_test.js index 1d687f9c46b..103ede0e829 100644 --- a/packages/ember-routing-htmlbars/tests/helpers/render_test.js +++ b/packages/ember-routing-htmlbars/tests/helpers/render_test.js @@ -82,6 +82,23 @@ QUnit.test("{{render}} helper should render given template", function() { ok(container.lookup('router:main')._lookupActiveView('home'), 'should register home as active view'); }); +QUnit.test("{{render}} helper should render nested helpers", function() { + var template = "

HI

{{render 'foo'}}"; + var controller = EmberController.extend({ container: container }); + view = EmberView.create({ + controller: controller.create(), + template: compile(template) + }); + + Ember.TEMPLATES['foo'] = compile("

FOO

{{render 'bar'}}"); + Ember.TEMPLATES['bar'] = compile("

BAR

{{render 'baz'}}"); + Ember.TEMPLATES['baz'] = compile("

BAZ

"); + + runAppend(view); + + equal(view.$().text(), 'HIFOOBARBAZ'); +}); + QUnit.test("{{render}} helper should have assertion if neither template nor view exists", function() { var template = "

HI

{{render 'oops'}}"; var controller = EmberController.extend({ container: container }); diff --git a/packages/ember/tests/routing/basic_test.js b/packages/ember/tests/routing/basic_test.js index b902848c4f3..9eaa993f98d 100644 --- a/packages/ember/tests/routing/basic_test.js +++ b/packages/ember/tests/routing/basic_test.js @@ -3850,3 +3850,57 @@ QUnit.test("Can disconnect from the render helper's children", function() { Ember.run(router, 'send', 'disconnect'); equal(Ember.$('#qunit-fixture .foo .index').text(), ''); }); + +QUnit.test("Can render({into:...}) nested render helpers", function() { + Ember.TEMPLATES.application = compile('{{render "foo"}}'); + Ember.TEMPLATES.foo = compile('
{{render "bar"}}
'); + Ember.TEMPLATES.bar = compile('
{{outlet}}
'); + Ember.TEMPLATES.index = compile('other'); + Ember.TEMPLATES.baz = compile('baz'); + + App.IndexRoute = Ember.Route.extend({ + renderTemplate: function() { + this.render({ into: 'bar' }); + }, + actions: { + changeToBaz: function() { + this.disconnectOutlet({ + parentView: 'bar', + outlet: 'main' + }); + this.render('baz', { into: 'bar' }); + } + } + }); + + bootApplication(); + equal(Ember.$('#qunit-fixture .bar').text(), 'other'); + Ember.run(router, 'send', 'changeToBaz'); + equal(Ember.$('#qunit-fixture .bar').text(), 'baz'); +}); + +QUnit.test("Can disconnect from nested render helpers", function() { + Ember.TEMPLATES.application = compile('{{render "foo"}}'); + Ember.TEMPLATES.foo = compile('
{{render "bar"}}
'); + Ember.TEMPLATES.bar = compile('
{{outlet}}
'); + Ember.TEMPLATES.index = compile('other'); + + App.IndexRoute = Ember.Route.extend({ + renderTemplate: function() { + this.render({ into: 'bar' }); + }, + actions: { + disconnect: function() { + this.disconnectOutlet({ + parentView: 'bar', + outlet: 'main' + }); + } + } + }); + + bootApplication(); + equal(Ember.$('#qunit-fixture .bar').text(), 'other'); + Ember.run(router, 'send', 'disconnect'); + equal(Ember.$('#qunit-fixture .bar').text(), ''); +});