From 5f0d067ffd5b79de78a968a1a34e166b0b1838eb Mon Sep 17 00:00:00 2001 From: Stefan Penner Date: Tue, 21 Apr 2015 10:22:23 -0700 Subject: [PATCH] [Bugfix beta] Component.prototype.layout is now settable. Previously setting `layout` would replace the underlying CP. This would prevent `layoutName` from working when a component had an existing template. --- packages/ember-views/lib/views/view.js | 18 ++++--- .../tests/views/view/layout_test.js | 53 +++++++++++++++++++ 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/packages/ember-views/lib/views/view.js b/packages/ember-views/lib/views/view.js index 66f6ec34d83..ff9735504e7 100644 --- a/packages/ember-views/lib/views/view.js +++ b/packages/ember-views/lib/views/view.js @@ -763,14 +763,20 @@ var View = CoreView.extend( @property layout @type Function - */ - layout: computed('layoutName', function(key) { - var layoutName = get(this, 'layoutName'); - var layout = this.templateForName(layoutName, 'layout'); + */ + layout: computed('layoutName', { + get(key) { + var layoutName = get(this, 'layoutName'); + var layout = this.templateForName(layoutName, 'layout'); + + Ember.assert("You specified the layoutName " + layoutName + " for " + this + ", but it did not exist.", !layoutName || !!layout); - Ember.assert("You specified the layoutName " + layoutName + " for " + this + ", but it did not exist.", !layoutName || !!layout); + return layout || get(this, 'defaultLayout'); + }, - return layout || get(this, 'defaultLayout'); + set(key, value) { + return value; + } }), _yield(context, options, morph) { diff --git a/packages/ember-views/tests/views/view/layout_test.js b/packages/ember-views/tests/views/view/layout_test.js index 78149f37d40..0371854ca8d 100644 --- a/packages/ember-views/tests/views/view/layout_test.js +++ b/packages/ember-views/tests/views/view/layout_test.js @@ -53,6 +53,59 @@ QUnit.test("should call the function of the associated layout", function() { equal(layoutCalled, 1, "layout is called when layout is present"); }); +QUnit.test("changing layoutName after setting layoutName continous to work", function() { + var layoutCalled = 0; + var otherLayoutCalled = 0; + + registry.register('template:layout', function() { layoutCalled++; }); + registry.register('template:other-layout', function() { otherLayoutCalled++; }); + + view = EmberView.create({ + container: container, + layoutName: 'layout' + }); + + run(view, 'createElement'); + equal(layoutCalled, 1, "layout is called when layout is present"); + equal(otherLayoutCalled, 0, "otherLayout is not yet called"); + + run(() => { + view.set('layoutName', 'other-layout'); + view.rerender(); + }); + + equal(layoutCalled, 1, "layout is called when layout is present"); + equal(otherLayoutCalled, 1, "otherLayoutis called when layoutName changes, and explicit rerender occurs"); +}); + +QUnit.test("changing layoutName after setting layout CP continous to work", function() { + var layoutCalled = 0; + var otherLayoutCalled = 0; + function otherLayout() { + otherLayoutCalled++; + } + + registry.register('template:other-layout', otherLayout); + + view = EmberView.create({ + container: container, + layout() { + layoutCalled++; + } + }); + + run(view, 'createElement'); + run(() => { + view.set('layoutName', 'other-layout'); + view.rerender(); + }); + + equal(view.get('layout'), otherLayout); + + equal(layoutCalled, 1, "layout is called when layout is present"); + equal(otherLayoutCalled, 1, "otherLayoutis called when layoutName changes, and explicit rerender occurs"); +}); + QUnit.test("should call the function of the associated template with itself as the context", function() { registry.register('template:testTemplate', function(dataSource) { return "

template was called for " + get(dataSource, 'personName') + "

";