Skip to content

Commit

Permalink
Merge pull request #11577 from ef4/fix-11539
Browse files Browse the repository at this point in the history
Fix view destruction inside outlets
  • Loading branch information
rwjblue committed Jun 29, 2015
2 parents 8102ab2 + 1fc7811 commit 922e2da
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 3 deletions.
11 changes: 10 additions & 1 deletion packages/ember-htmlbars/lib/keywords/real_outlet.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ export default {
toRender.template = topLevelViewTemplate;
}

return { outletState: selectedOutletState, hasParentOutlet: env.hasParentOutlet };
return {
outletState: selectedOutletState,
hasParentOutlet: env.hasParentOutlet,
manager: state.manager
};
},

childEnv(state, env) {
Expand Down Expand Up @@ -68,6 +72,11 @@ export default {
Ember.Logger.info('Rendering ' + toRender.name + ' with ' + ViewClass, { fullName: 'view:' + toRender.name });
}

if (state.manager) {
state.manager.destroy();
state.manager = null;
}

var nodeManager = ViewNodeManager.create(renderNode, env, {}, options, parentView, null, null, template);
state.manager = nodeManager;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,10 @@ ViewNodeManager.prototype.rerender = function(env, attrs, visitor) {
};

ViewNodeManager.prototype.destroy = function() {
this.component.destroy();
if (this.component) {
this.component.destroy();
this.component = null;
}
};

function getTemplate(componentOrView) {
Expand Down
2 changes: 1 addition & 1 deletion packages/ember-metal-views/lib/renderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ Renderer.prototype.renderElementRemoval =
if (view._willRemoveElement) {
view._willRemoveElement = false;

if (view._renderNode) {
if (view._renderNode && view.element && view.element.parentNode) {
view._renderNode.clear();
}
this.didDestroyElement(view);
Expand Down
25 changes: 25 additions & 0 deletions packages/ember-routing-htmlbars/tests/helpers/outlet_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,31 @@ QUnit.test('{{outlet}} should rerender when bound name changes', function() {
equal(top.$().text().trim(), 'second');
});

QUnit.test('views created by {{outlet}} should get destroyed', function() {
let inserted = 0;
let destroyed = 0;
var routerState = {
render: {
ViewClass: EmberView.extend({
didInsertElement() {
inserted++;
},
willDestroyElement() {
destroyed++;
}
})
},
outlets: {}
};
top.setOutletState(routerState);
runAppend(top);
equal(inserted, 1, 'expected to see view inserted');
run(function() {
top.setOutletState(withTemplate('hello world'));
});
equal(destroyed, 1, 'expected to see view destroyed');
});


function withTemplate(string) {
return {
Expand Down

0 comments on commit 922e2da

Please sign in to comment.