Skip to content

Commit

Permalink
Merge pull request #10527 from rwjblue/fix-component-context
Browse files Browse the repository at this point in the history
[BUGFIX release] Ensure that Component context is not forced to parent context.
  • Loading branch information
ebryn committed Feb 25, 2015
2 parents 922ab71 + 83acee9 commit 0eac6b4
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export default function appendTemplatedView(parentView, morph, viewClassOrInstan
// no specified controller. See View#_context for more information.

var noControllerInProto = !viewProto.controller;
if (viewProto.controller.isDescriptor) { noControllerInProto = true; }
if (viewProto.controller && viewProto.controller.isDescriptor) { noControllerInProto = true; }
if (noControllerInProto &&
!viewProto.controllerBinding &&
!props.controller &&
Expand Down
106 changes: 106 additions & 0 deletions packages/ember-htmlbars/tests/system/append-templated-view-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import { runAppend, runDestroy } from "ember-runtime/tests/utils";
import EmberView from 'ember-views/views/view';
import EmberComponent from 'ember-views/views/component';
import compile from "ember-template-compiler/system/compile";

var view;
QUnit.module('ember-htmlbars: appendTemplatedView', {
teardown: function() {
runDestroy(view);
}
});

QUnit.test('can accept a view instance', function() {
var controller = {
someProp: 'controller context',
someView: EmberView.create({
template: compile('{{someProp}}')
})
};

view = EmberView.create({
controller: controller,
template: compile('{{someProp}} - {{view someView}}')
});

runAppend(view);

equal(view.$().text(), 'controller context - controller context');
});

QUnit.test('can accept a view factory', function() {
var controller = {
someProp: 'controller context',
someView: EmberView.extend({
template: compile('{{someProp}}')
})
};

view = EmberView.create({
controller: controller,
template: compile('{{someProp}} - {{view someView}}')
});

runAppend(view);

equal(view.$().text(), 'controller context - controller context');
});

QUnit.test('does change the context if the view factory has a controller specified', function() {
var controller = {
someProp: 'controller context',
someView: EmberView.extend({
controller: {
someProp: 'view local controller context'
},
template: compile('{{someProp}}')
})
};

view = EmberView.create({
controller: controller,
template: compile('{{someProp}} - {{view someView}}')
});

runAppend(view);

equal(view.$().text(), 'controller context - view local controller context');
});

QUnit.test('does change the context if a component factory is used', function() {
var controller = {
someProp: 'controller context',
someView: EmberComponent.extend({
someProp: 'view local controller context',
layout: compile('{{someProp}}')
})
};

view = EmberView.create({
controller: controller,
template: compile('{{someProp}} - {{view someView}}')
});

runAppend(view);

equal(view.$().text(), 'controller context - view local controller context');
});

QUnit.test('does change the context if a component instanced is used', function() {
var controller = {
someProp: 'controller context',
someView: EmberComponent.create({
someProp: 'view local controller context',
layout: compile('{{someProp}}')
})
};

view = EmberView.create({
controller: controller,
template: compile('{{someProp}} - {{view someView}}')
});

runAppend(view);

equal(view.$().text(), 'controller context - view local controller context');
});
7 changes: 7 additions & 0 deletions packages/ember-views/lib/views/component.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,13 @@ var a_slice = Array.prototype.slice;
@extends Ember.View
*/
var Component = View.extend(TargetActionSupport, ComponentTemplateDeprecation, {
/*
This is set so that the proto inspection in appendTemplatedView does not
think that it should set the components `context` to that of the parent view.
*/
controller: null,
context: null,

instrumentName: 'component',
instrumentDisplay: computed(function() {
if (this._debugContainerKey) {
Expand Down

0 comments on commit 0eac6b4

Please sign in to comment.