From 6083b25d05841d2c72e5e984fa62821f9e842e39 Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Thu, 25 Feb 2016 14:14:46 -0800 Subject: [PATCH] [BUGFIX release] Do not set model on {{render rerender Upon rerender of the {{render}} helper, the model was set to the value of the second argument regardless of if there was a second argument. This means upon rerender a singleton controller would lose its model. Should be backported to 1.13 --- .../lib/keywords/render.js | 6 ++- .../tests/helpers/render_test.js | 46 ++++++++++++++++++- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/packages/ember-routing-htmlbars/lib/keywords/render.js b/packages/ember-routing-htmlbars/lib/keywords/render.js index 310f6764659..9f3be67702f 100644 --- a/packages/ember-routing-htmlbars/lib/keywords/render.js +++ b/packages/ember-routing-htmlbars/lib/keywords/render.js @@ -241,8 +241,10 @@ export default { }, rerender(node, env, scope, params, hash, template, inverse, visitor) { - var model = read(params[1]); - node.getState().controller.set('model', model); + if (params.length > 1) { + var model = read(params[1]); + node.getState().controller.set('model', model); + } } }; diff --git a/packages/ember-routing-htmlbars/tests/helpers/render_test.js b/packages/ember-routing-htmlbars/tests/helpers/render_test.js index cd778daa263..a85739b7a74 100644 --- a/packages/ember-routing-htmlbars/tests/helpers/render_test.js +++ b/packages/ember-routing-htmlbars/tests/helpers/render_test.js @@ -221,6 +221,7 @@ QUnit.test('{{render}} helper should raise an error when a given controller name QUnit.test('{{render}} helper should render with given controller', function() { var template = '{{render "home" controller="posts"}}'; var Controller = EmberController.extend(); + let model = {}; let controller = Controller.create({ [OWNER]: appInstance }); @@ -230,6 +231,7 @@ QUnit.test('{{render}} helper should render with given controller', function() { init() { this._super(...arguments); this.uniqueId = id++; + this.set('model', model); } })); @@ -243,9 +245,51 @@ QUnit.test('{{render}} helper should render with given controller', function() { runAppend(view); - var uniqueId = appInstance.lookup('controller:posts').get('uniqueId'); + let renderedController = appInstance.lookup('controller:posts'); + let uniqueId = renderedController.get('uniqueId'); + let renderedModel = renderedController.get('model'); equal(uniqueId, 0, 'precond - first uniqueId is used for singleton'); equal(uniqueId, view.$().html(), 'rendered with singleton controller'); + equal(renderedModel, model, 'rendered with model on controller'); +}); + +QUnit.test('{{render}} helper should rerender with given controller', function() { + let template = '{{render "home" controller="posts"}}'; + let Controller = EmberController.extend(); + let model = {}; + let controller = Controller.create({ + [OWNER]: appInstance + }); + var id = 0; + + appInstance.register('controller:posts', EmberController.extend({ + init() { + this._super(...arguments); + this.uniqueId = id++; + this.set('model', model); + } + })); + + view = EmberView.create({ + [OWNER]: appInstance, + controller, + template: compile(template) + }); + + Ember.TEMPLATES['home'] = compile('{{uniqueId}}'); + + runAppend(view); + run(() => { + view.rerender(); + }); + + let renderedController = appInstance.lookup('controller:posts'); + let uniqueId = renderedController.get('uniqueId'); + let renderedModel = renderedController.get('model'); + + equal(uniqueId, 0, 'precond - first uniqueId is used for singleton'); + equal(uniqueId, view.$().html(), 'rendered with singleton controller'); + equal(renderedModel, model, 'rendered with model on controller'); }); QUnit.test('{{render}} helper should render a template without a model only once', function() {