Skip to content

Commit 3255cf3

Browse files
mmalerbajelbourn
authored andcommitted
virtual-scroll: use detectChanges rather than markForCheck in CdkVirtualScrollViewport (#12158)
1 parent 45b949a commit 3255cf3

File tree

2 files changed

+124
-77
lines changed

2 files changed

+124
-77
lines changed

src/cdk-experimental/scrolling/virtual-scroll-viewport.spec.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ describe('CdkVirtualScrollViewport', () => {
2929
viewport.setRenderedContentOffset(
3030
'arbitrary string as offset' as any, 'arbitrary string as to' as any);
3131
fixture.detectChanges();
32+
flush();
3233

3334
expect((viewport._renderedContentTransform as any).changingThisBreaksApplicationSecurity)
3435
.toBe('translateY(NaNpx)');
@@ -58,11 +59,13 @@ describe('CdkVirtualScrollViewport', () => {
5859
it('should update viewport size', fakeAsync(() => {
5960
testComponent.viewportSize = 300;
6061
fixture.detectChanges();
62+
flush();
6163
viewport.checkViewportSize();
6264
expect(viewport.getViewportSize()).toBe(300);
6365

6466
testComponent.viewportSize = 500;
6567
fixture.detectChanges();
68+
flush();
6669
viewport.checkViewportSize();
6770
expect(viewport.getViewportSize()).toBe(500);
6871
}));
@@ -78,6 +81,7 @@ describe('CdkVirtualScrollViewport', () => {
7881
finishInit(fixture);
7982
triggerScroll(viewport, testComponent.itemSize + 5);
8083
fixture.detectChanges();
84+
flush();
8185

8286
expect(viewport.getOffsetToRenderedContentStart()).toBe(testComponent.itemSize,
8387
'should have 50px offset since first 50px item is not rendered');
@@ -87,6 +91,7 @@ describe('CdkVirtualScrollViewport', () => {
8791
finishInit(fixture);
8892
triggerScroll(viewport, testComponent.itemSize + 5);
8993
fixture.detectChanges();
94+
flush();
9095

9196
expect(viewport.measureScrollOffset()).toBe(testComponent.itemSize + 5);
9297
}));
@@ -110,6 +115,7 @@ describe('CdkVirtualScrollViewport', () => {
110115
finishInit(fixture);
111116
viewport.setTotalContentSize(10000);
112117
fixture.detectChanges();
118+
flush();
113119

114120
expect(viewport.elementRef.nativeElement.scrollHeight).toBe(10000);
115121
}));
@@ -118,6 +124,7 @@ describe('CdkVirtualScrollViewport', () => {
118124
finishInit(fixture);
119125
viewport.setRenderedRange({start: 2, end: 3});
120126
fixture.detectChanges();
127+
flush();
121128

122129
const items = fixture.elementRef.nativeElement.querySelectorAll('.item');
123130
expect(items.length).toBe(1, 'Expected 1 item to be rendered');
@@ -128,6 +135,7 @@ describe('CdkVirtualScrollViewport', () => {
128135
finishInit(fixture);
129136
viewport.setRenderedContentOffset(10, 'to-start');
130137
fixture.detectChanges();
138+
flush();
131139

132140
expect(viewport.getOffsetToRenderedContentStart()).toBe(10);
133141
}));
@@ -140,6 +148,7 @@ describe('CdkVirtualScrollViewport', () => {
140148

141149
viewport.setRenderedContentOffset(contentSize + 10, 'to-end');
142150
fixture.detectChanges();
151+
flush();
143152

144153
expect(viewport.getOffsetToRenderedContentStart()).toBe(10);
145154
}));
@@ -148,8 +157,11 @@ describe('CdkVirtualScrollViewport', () => {
148157
finishInit(fixture);
149158
viewport.setScrollOffset(testComponent.itemSize * 2);
150159
fixture.detectChanges();
160+
flush();
161+
151162
triggerScroll(viewport);
152163
fixture.detectChanges();
164+
flush();
153165

154166
expect(viewport.elementRef.nativeElement.scrollTop).toBe(testComponent.itemSize * 2);
155167
expect(viewport.getRenderedRange()).toEqual({start: 2, end: 6});
@@ -163,6 +175,7 @@ describe('CdkVirtualScrollViewport', () => {
163175
for (let offset = 0; offset <= maxOffset; offset += 10) {
164176
triggerScroll(viewport, offset);
165177
fixture.detectChanges();
178+
flush();
166179

167180
const expectedRange = {
168181
start: Math.floor(offset / testComponent.itemSize),
@@ -188,6 +201,7 @@ describe('CdkVirtualScrollViewport', () => {
188201
for (let offset = maxOffset; offset >= 0; offset -= 10) {
189202
triggerScroll(viewport, offset);
190203
fixture.detectChanges();
204+
flush();
191205

192206
const expectedRange = {
193207
start: Math.floor(offset / testComponent.itemSize),
@@ -220,6 +234,7 @@ describe('CdkVirtualScrollViewport', () => {
220234
finishInit(fixture);
221235
triggerScroll(viewport, testComponent.itemSize * 2);
222236
fixture.detectChanges();
237+
flush();
223238

224239
expect(viewport.getRenderedRange()).toEqual({start: 1, end: 7},
225240
'should render 6 50px items to fill 200px space, plus one buffer element at the' +
@@ -231,6 +246,7 @@ describe('CdkVirtualScrollViewport', () => {
231246
finishInit(fixture);
232247
triggerScroll(viewport, testComponent.itemSize * 6);
233248
fixture.detectChanges();
249+
flush();
234250

235251
expect(viewport.getRenderedRange()).toEqual({start: 5, end: 10},
236252
'should render the last 5 50px items to fill 200px space, plus one buffer element at' +
@@ -241,12 +257,14 @@ describe('CdkVirtualScrollViewport', () => {
241257
finishInit(fixture);
242258
triggerScroll(viewport, testComponent.itemSize * 2);
243259
fixture.detectChanges();
260+
flush();
244261

245262
expect(viewport.getRenderedRange())
246263
.toEqual({start: 2, end: 6}, 'should render 4 50px items to fill 200px space');
247264

248265
testComponent.itemSize *= 2;
249266
fixture.detectChanges();
267+
flush();
250268

251269
expect(viewport.getRenderedRange())
252270
.toEqual({start: 1, end: 3}, 'should render 2 100px items to fill 200px space');
@@ -256,12 +274,14 @@ describe('CdkVirtualScrollViewport', () => {
256274
finishInit(fixture);
257275
triggerScroll(viewport, testComponent.itemSize * 2);
258276
fixture.detectChanges();
277+
flush();
259278

260279
expect(viewport.getRenderedRange())
261280
.toEqual({start: 2, end: 6}, 'should render 4 50px items to fill 200px space');
262281

263282
testComponent.bufferSize = 1;
264283
fixture.detectChanges();
284+
flush();
265285

266286
expect(viewport.getRenderedRange())
267287
.toEqual({start: 1, end: 7}, 'should expand to 1 buffer element on each side');
@@ -271,14 +291,18 @@ describe('CdkVirtualScrollViewport', () => {
271291
finishInit(fixture);
272292
triggerScroll(viewport, testComponent.itemSize * 6);
273293
fixture.detectChanges();
294+
flush();
274295

275296
expect(viewport.getOffsetToRenderedContentStart())
276297
.toBe(testComponent.itemSize * 6, 'should be scrolled to bottom of 10 item list');
277298

278299
testComponent.items = Array(5).fill(0);
279300
fixture.detectChanges();
301+
flush();
302+
280303
triggerScroll(viewport);
281304
fixture.detectChanges();
305+
flush();
282306

283307
expect(viewport.getOffsetToRenderedContentStart())
284308
.toBe(testComponent.itemSize, 'should be scrolled to bottom of 5 item list');
@@ -293,6 +317,7 @@ describe('CdkVirtualScrollViewport', () => {
293317
for (let offset = 0; offset <= maxOffset; offset += 10) {
294318
triggerScroll(viewport, offset);
295319
fixture.detectChanges();
320+
flush();
296321

297322
const expectedRange = {
298323
start: Math.floor(offset / testComponent.itemSize),
@@ -319,6 +344,7 @@ describe('CdkVirtualScrollViewport', () => {
319344
for (let offset = maxOffset; offset >= 0; offset -= 10) {
320345
triggerScroll(viewport, offset);
321346
fixture.detectChanges();
347+
flush();
322348

323349
const expectedRange = {
324350
start: Math.floor(offset / testComponent.itemSize),
@@ -346,6 +372,7 @@ describe('CdkVirtualScrollViewport', () => {
346372

347373
data.next([1, 2, 3]);
348374
fixture.detectChanges();
375+
flush();
349376

350377
expect(viewport.getRenderedRange())
351378
.toEqual({start: 0, end: 3}, 'newly emitted items should be rendered');
@@ -355,7 +382,6 @@ describe('CdkVirtualScrollViewport', () => {
355382
const data = new Subject<number[]>();
356383
testComponent.items = new ArrayDataSource(data) as any;
357384
finishInit(fixture);
358-
flush();
359385

360386
expect(viewport.getRenderedRange())
361387
.toEqual({start: 0, end: 0}, 'no items should be rendered');
@@ -375,11 +401,13 @@ describe('CdkVirtualScrollViewport', () => {
375401

376402
testComponent.items = [0];
377403
fixture.detectChanges();
404+
flush();
378405

379406
expect(testComponent.virtualForViewContainer.detach).not.toHaveBeenCalled();
380407

381408
testComponent.items = [1];
382409
fixture.detectChanges();
410+
flush();
383411

384412
expect(testComponent.virtualForViewContainer.detach).toHaveBeenCalled();
385413
}));
@@ -392,11 +420,13 @@ describe('CdkVirtualScrollViewport', () => {
392420

393421
testComponent.items = [0];
394422
fixture.detectChanges();
423+
flush();
395424

396425
expect(testComponent.virtualForViewContainer.detach).not.toHaveBeenCalled();
397426

398427
testComponent.items = [1];
399428
fixture.detectChanges();
429+
flush();
400430

401431
expect(testComponent.virtualForViewContainer.detach).not.toHaveBeenCalled();
402432
}));
@@ -413,6 +443,7 @@ describe('CdkVirtualScrollViewport', () => {
413443
spy.calls.reset();
414444
triggerScroll(viewport, 10);
415445
fixture.detectChanges();
446+
flush();
416447

417448
// As we first start to scroll we need to create one more item. This is because the first item
418449
// is still partially on screen and therefore can't be removed yet. At the same time a new
@@ -425,6 +456,7 @@ describe('CdkVirtualScrollViewport', () => {
425456
for (let offset = 10; offset <= maxOffset; offset += 10) {
426457
triggerScroll(viewport, offset);
427458
fixture.detectChanges();
459+
flush();
428460
}
429461

430462
// As we scroll through the rest of the items, no new views should be created, our existing 5
@@ -445,6 +477,7 @@ describe('CdkVirtualScrollViewport', () => {
445477
spy.calls.reset();
446478
triggerScroll(viewport, 10);
447479
fixture.detectChanges();
480+
flush();
448481

449482
// As we first start to scroll we need to create one more item. This is because the first item
450483
// is still partially on screen and therefore can't be removed yet. At the same time a new
@@ -457,6 +490,7 @@ describe('CdkVirtualScrollViewport', () => {
457490
for (let offset = 10; offset <= maxOffset; offset += 10) {
458491
triggerScroll(viewport, offset);
459492
fixture.detectChanges();
493+
flush();
460494
}
461495

462496
// Since our template cache size is 0, as we scroll through the rest of the items, we need to
@@ -514,6 +548,7 @@ function finishInit(fixture: ComponentFixture<any>) {
514548

515549
// On the second cycle we render the items.
516550
fixture.detectChanges();
551+
flush();
517552
}
518553

519554
/** Trigger a scroll event on the viewport (optionally setting a new scroll offset). */

0 commit comments

Comments
 (0)