Skip to content

Commit fc6c710

Browse files
authored
Fix for detached Node element exception (#389)
1 parent 08b1f6e commit fc6c710

File tree

4 files changed

+67
-8
lines changed

4 files changed

+67
-8
lines changed

addon/-private/data-view/radar/radar.js

+3
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,9 @@ export default class Radar {
539539
if (item) {
540540
insertRangeBefore(this._domPool, null, component.realUpperBound, component.realLowerBound);
541541
} else {
542+
// Insert the virtual component bound back to make sure Glimmer is
543+
// not confused about the state of the DOM.
544+
insertRangeBefore(this._itemContainer, null, component.realUpperBound, component.realLowerBound);
542545
run(() => {
543546
virtualComponents.removeObject(component);
544547
});

tests/acceptance/acceptance-tests/record-array-test.js

+37
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { module, test } from 'qunit';
22
import { setupApplicationTest } from 'ember-qunit';
33

44
import { click, find, findAll, visit as newVisit } from '@ember/test-helpers';
5+
import scrollTo from '../../helpers/scroll-to';
56

67
module('Acceptance | Record Array', function(hooks) {
78
setupApplicationTest(hooks);
@@ -14,6 +15,42 @@ module('Acceptance | Record Array', function(hooks) {
1415
assert.equal(find('number-slide:last-of-type').textContent.replace(/\s/g, ''), '14(14)', 'correct last item rendered');
1516
});
1617

18+
test('RecordArrays update correctly after scrolling and updating items', async function(assert) {
19+
await newVisit('/acceptance-tests/record-array');
20+
21+
assert.equal(findAll('number-slide').length, 15, 'correct number of items rendered');
22+
23+
await scrollTo('.table-wrapper', 0, 600);
24+
25+
await click('#update-items-button');
26+
27+
assert.equal(findAll('number-slide').length, 5, 'correct number of items rendered');
28+
});
29+
30+
test('RecordArrays update correctly after partial update', async function(assert) {
31+
await newVisit('/acceptance-tests/record-array');
32+
33+
assert.equal(findAll('number-slide').length, 15, 'correct number of items rendered');
34+
35+
await click('#partial-update-button');
36+
37+
assert.equal(findAll('number-slide').length, 5, 'correct number of items rendered');
38+
});
39+
40+
test('RecordArrays update correctly after being hidden and shown', async function(assert) {
41+
await newVisit('/acceptance-tests/record-array');
42+
43+
assert.equal(findAll('number-slide').length, 15, 'correct number of items rendered');
44+
45+
await click('#hide-vc-button');
46+
47+
assert.equal(findAll('number-slide').length, 0, 'correct number of items rendered');
48+
49+
await click('#show-vc-button');
50+
51+
assert.equal(findAll('number-slide').length, 15, 'correct number of items rendered');
52+
});
53+
1754
test('RecordArrays updates correctly after deleting items', async function(assert) {
1855
await newVisit('/acceptance-tests/record-array');
1956

tests/dummy/app/routes/acceptance-tests/record-array/controller.js

+14
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,29 @@ import { inject as service } from '@ember/service';
44
export default Controller.extend({
55
store: service(),
66
prefixed: true,
7+
vcShown: true,
78

89
actions: {
910
updateItems() {
1011
this.get('store').unloadAll('number-item');
1112
this.get('store').query('number-item', { length: 5 });
1213
},
1314

15+
partialUpdate() {
16+
let length = this.model.content.length;
17+
this.set('model', this.model.toArray().removeAt(0, length - 5));
18+
},
19+
1420
showPrefixed() {
1521
this.toggleProperty('prefixed');
22+
},
23+
24+
hideVC() {
25+
this.set('vcShown', false);
26+
},
27+
28+
showVC() {
29+
this.set('vcShown', true);
1630
}
1731
}
1832
});
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1-
<div class="table-wrapper dark">
2-
{{#vertical-collection this.model
3-
estimateHeight=50
4-
bufferSize=5
5-
as |item index|}}
6-
{{number-slide item=item itemIndex=index prefixed=this.prefixed}}
7-
{{/vertical-collection}}
8-
</div>
1+
{{#if this.vcShown}}
2+
<div class="table-wrapper dark">
3+
{{#vertical-collection this.model
4+
estimateHeight=50
5+
bufferSize=5
6+
as |item index|}}
7+
{{number-slide item=item itemIndex=index prefixed=this.prefixed}}
8+
{{/vertical-collection}}
9+
</div>
10+
{{/if}}
911

12+
<button id="hide-vc-button" {{action "hideVC"}}>Hide VC</button>
13+
<button id="show-vc-button" {{action "showVC"}}>Show VC</button>
14+
<button id="partial-update-button" {{action "partialUpdate"}}>Partial Update</button>
1015
<button id="update-items-button" {{action "updateItems"}}>Update items</button>
1116
<button id="show-prefixed-button" {{action "showPrefixed"}}>Show prefixed</button>

0 commit comments

Comments
 (0)