From c779738175596b836205bdeea434b44f4c5940c1 Mon Sep 17 00:00:00 2001 From: Andrew Stoker Date: Mon, 29 Aug 2016 14:53:56 -0400 Subject: [PATCH] fix(virtual-repeat): check for infinite-scroll attribute fixes: https://github.com/aurelia/ui-virtualization/issues/81 Check to make sure that we have the infinite scroll attribute before attempting to do operations with it. --- src/virtual-repeat.js | 2 +- test/virtual-repeat-integration.spec.js | 28 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/virtual-repeat.js b/src/virtual-repeat.js index 7f41512..f55e7b1 100644 --- a/src/virtual-repeat.js +++ b/src/virtual-repeat.js @@ -278,7 +278,7 @@ export class VirtualRepeat extends AbstractRepeater { if (!this._calledGetMore) { let executeGetMore = () => { this._calledGetMore = true; - let func = (this.view(0) && this.view(0).firstChild.au) ? this.view(0).firstChild.au['infinite-scroll-next'].instruction.attributes['infinite-scroll-next'] : undefined; + let func = (this.view(0) && this.view(0).firstChild && this.view(0).firstChild.au && this.view(0).firstChild.au['infinite-scroll-next']) ? this.view(0).firstChild.au['infinite-scroll-next'].instruction.attributes['infinite-scroll-next'] : undefined; let topIndex = this._first; let isAtBottom = this._bottomBufferHeight === 0; let isAtTop = this._isAtTop; diff --git a/test/virtual-repeat-integration.spec.js b/test/virtual-repeat-integration.spec.js index d2909ed..02cc259 100644 --- a/test/virtual-repeat-integration.spec.js +++ b/test/virtual-repeat-integration.spec.js @@ -188,6 +188,11 @@ describe('VirtualRepeat Integration', () => { let hiddenVirtualRepeat; let hiddenViewModel; + let containerComponent; + let containerCreate; + let containerVirtualRepeat; + let containerViewModel; + beforeEach(() => { items = []; for(let i = 0; i < 1000; ++i) { @@ -214,11 +219,25 @@ describe('VirtualRepeat Integration', () => { hiddenVirtualRepeat = hiddenComponent.sut; hiddenViewModel = hiddenComponent.viewModel; }); + + containerComponent = StageComponent + .withResources('src/virtual-repeat') + .inView(`
+
\${item}
+
`) + .boundTo({ items: items }); + + containerCreate = containerComponent.create().then(() => { + containerVirtualRepeat = containerComponent.sut; + containerViewModel = containerComponent.viewModel; + spyOn(containerVirtualRepeat, '_onScroll').and.callThrough(); + }); }); afterEach(() => { component.cleanUp(); hiddenComponent.cleanUp(); + containerComponent.cleanUp(); }); describe('handles delete', () => { @@ -326,6 +345,15 @@ describe('VirtualRepeat Integration', () => { }); }); }); + + it('handles scrolling to bottom', done => { + containerCreate.then(() => { + validateScroll(containerVirtualRepeat, containerViewModel, () => { + expect(containerVirtualRepeat._onScroll).toHaveBeenCalled(); + done(); + }, 'scrollContainer2') + }); + }); }); describe('iterating table', () => {