Skip to content

Commit fb49fa0

Browse files
committed
Merge pull request #11685 from stefanpenner/component-cleanup
make linkChild idempotent
2 parents 98522dd + b0784c1 commit fb49fa0

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ before_install:
1414
- "npm config set spin false"
1515
- "npm install -g npm@^2"
1616
- "npm --version"
17+
- "phantomjs --version"
1718

1819
install:
1920
- "npm install"

packages/ember-views/lib/mixins/view_child_views_support.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import setProperties from 'ember-metal/set_properties';
1010

1111
var EMPTY_ARRAY = [];
1212

13-
var ViewChildViewsSupport = Mixin.create({
13+
export default Mixin.create({
1414
/**
1515
Array of child views. You should never edit this array directly.
1616
Instead, use `appendChild` and `removeFromParent`.
@@ -90,6 +90,8 @@ var ViewChildViewsSupport = Mixin.create({
9090

9191
var attrs = _attrs || {};
9292
var view;
93+
94+
attrs.parentView = this;
9395
attrs.renderer = this.renderer;
9496
attrs._viewRegistry = this._viewRegistry;
9597

@@ -123,8 +125,11 @@ var ViewChildViewsSupport = Mixin.create({
123125

124126
linkChild(instance) {
125127
instance.container = this.container;
126-
set(instance, 'parentView', this);
127-
instance.trigger('parentViewDidChange');
128+
if (get(instance, 'parentView') !== this) {
129+
// linkChild should be idempotentj
130+
set(instance, 'parentView', this);
131+
instance.trigger('parentViewDidChange');
132+
}
128133
instance.ownerView = this.ownerView;
129134
},
130135

@@ -133,5 +138,3 @@ var ViewChildViewsSupport = Mixin.create({
133138
instance.trigger('parentViewDidChange');
134139
}
135140
});
136-
137-
export default ViewChildViewsSupport;

packages/ember-views/tests/views/view/create_child_view_test.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { get } from 'ember-metal/property_get';
22
import run from 'ember-metal/run_loop';
33
import EmberView from 'ember-views/views/view';
4+
import { on } from 'ember-metal/events';
5+
import { observer } from 'ember-metal/mixin';
46

57
var view, myViewClass, newView, container;
68

@@ -33,7 +35,28 @@ QUnit.test('should create view from class with any passed attributes', function(
3335
equal(newView.container, container, 'expects to share container with parent');
3436
ok(get(newView, 'isMyView'), 'newView is instance of myView');
3537
equal(get(newView, 'foo'), 'baz', 'view did get custom attributes');
36-
ok(!attrs.parentView, 'the original attributes hash was not mutated');
38+
});
39+
40+
QUnit.test('creating a childView, (via createChildView) should make parentView initial state and not emit change events nore helper actions', function() {
41+
expect(2);
42+
43+
newView = view.createChildView(EmberView.extend({
44+
init() {
45+
this._super(...arguments);
46+
ok(true, 'did init');
47+
},
48+
parentViewDidReallyChange: on('parentViewDidChange', function() {
49+
ok(false, 'expected to NOT emit parentViewDidChange');
50+
}),
51+
controllerDidChange: observer('controller', function() {
52+
ok(false, 'expected to NOT expect controller to change');
53+
}),
54+
parentViewDidChange: observer('parentView', function() {
55+
ok(false, 'expected to NOT expect parentViewto change');
56+
})
57+
}));
58+
59+
equal(newView.get('parentView'), view, 'expected the correct parentView');
3760
});
3861

3962
QUnit.test('should set newView.parentView to receiver', function() {

0 commit comments

Comments
 (0)