Skip to content

Commit accf559

Browse files
committed
refactor: switch to even simpler approach
1 parent 332e9d5 commit accf559

19 files changed

+58
-156
lines changed
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Component} from '@angular/core';
2-
import {ScrollStrategyOptions, ScrollStrategy} from '@angular/material';
2+
import {Overlay, ScrollStrategy} from '@angular/material';
33

44
@Component({
55
moduleId: module.id,
@@ -8,6 +8,6 @@ import {ScrollStrategyOptions, ScrollStrategy} from '@angular/material';
88
styleUrls: ['block-scroll-strategy-e2e.css'],
99
})
1010
export class BlockScrollStrategyE2E {
11-
constructor(private _scrollStrategyOptions: ScrollStrategyOptions) { }
12-
scrollStrategy: ScrollStrategy = this._scrollStrategyOptions.block();
11+
constructor(private _overlay: Overlay) { }
12+
scrollStrategy: ScrollStrategy = this._overlay.scrollStrategies.block();
1313
}

src/lib/autocomplete/autocomplete-trigger.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
} from '@angular/core';
1414
import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
1515
import {DOCUMENT} from '@angular/platform-browser';
16-
import {Overlay, OverlayRef, OverlayState, TemplatePortal, ScrollStrategyOptions} from '../core';
16+
import {Overlay, OverlayRef, OverlayState, TemplatePortal} from '../core';
1717
import {MdAutocomplete} from './autocomplete';
1818
import {PositionStrategy} from '../core/overlay/position/position-strategy';
1919
import {ConnectedPositionStrategy} from '../core/overlay/position/connected-position-strategy';
@@ -103,7 +103,6 @@ export class MdAutocompleteTrigger implements ControlValueAccessor, OnDestroy {
103103
constructor(private _element: ElementRef, private _overlay: Overlay,
104104
private _viewContainerRef: ViewContainerRef,
105105
private _changeDetectorRef: ChangeDetectorRef,
106-
private _scrollStrategyOptions: ScrollStrategyOptions,
107106
@Optional() private _dir: Dir, private _zone: NgZone,
108107
@Optional() @Host() private _inputContainer: MdInputContainer,
109108
@Optional() @Inject(DOCUMENT) private _document: any) {}
@@ -367,7 +366,7 @@ export class MdAutocompleteTrigger implements ControlValueAccessor, OnDestroy {
367366
overlayState.positionStrategy = this._getOverlayPosition();
368367
overlayState.width = this._getHostWidth();
369368
overlayState.direction = this._dir ? this._dir.value : 'ltr';
370-
overlayState.scrollStrategy = this._scrollStrategyOptions.reposition;
369+
overlayState.scrollStrategy = this._overlay.scrollStrategies.reposition();
371370
return overlayState;
372371
}
373372

src/lib/core/overlay/overlay-directives.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
import {Overlay, OVERLAY_PROVIDERS} from './overlay';
1717
import {OverlayRef} from './overlay-ref';
1818
import {TemplatePortal} from '../portal/portal';
19-
import {OverlayState, OverlayStateScrollStrategy} from './overlay-state';
19+
import {OverlayState} from './overlay-state';
2020
import {
2121
ConnectionPositionPair,
2222
ConnectedOverlayPositionChange
@@ -25,7 +25,6 @@ import {PortalModule} from '../portal/portal-directives';
2525
import {ConnectedPositionStrategy} from './position/connected-position-strategy';
2626
import {Dir, LayoutDirection} from '../rtl/dir';
2727
import {Scrollable} from './scroll/scrollable';
28-
import {ScrollStrategyOptions} from './scroll/scroll-strategy-options';
2928
import {ScrollStrategy} from './scroll/scroll-strategy';
3029
import {coerceBooleanProperty} from '../coercion/boolean-property';
3130
import {ESCAPE} from '../keyboard/keycodes';
@@ -124,7 +123,7 @@ export class ConnectedOverlayDirective implements OnDestroy, OnChanges {
124123
@Input() backdropClass: string;
125124

126125
/** Strategy to be used when handling scroll events while the overlay is open. */
127-
@Input() scrollStrategy: OverlayStateScrollStrategy = this._scrollStrategyOptions.reposition;
126+
@Input() scrollStrategy: ScrollStrategy = this._overlay.scrollStrategies.reposition();
128127

129128
/** Whether the overlay is open. */
130129
@Input() open: boolean = false;
@@ -156,7 +155,6 @@ export class ConnectedOverlayDirective implements OnDestroy, OnChanges {
156155
constructor(
157156
private _overlay: Overlay,
158157
private _renderer: Renderer2,
159-
private _scrollStrategyOptions: ScrollStrategyOptions,
160158
templateRef: TemplateRef<any>,
161159
viewContainerRef: ViewContainerRef,
162160
@Optional() private _dir: Dir) {

src/lib/core/overlay/overlay-ref.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,7 @@ export class OverlayRef implements PortalHost {
2323
private _scrollStrategy: ScrollStrategy,
2424
private _ngZone: NgZone) {
2525

26-
let scrollStrategyConfig = null;
27-
28-
if (_state.scrollStrategy && typeof _state.scrollStrategy !== 'function') {
29-
scrollStrategyConfig = _state.scrollStrategy.config;
30-
}
31-
32-
_scrollStrategy.attach(this, scrollStrategyConfig);
26+
_scrollStrategy.attach(this);
3327
}
3428

3529
/** The overlay's HTML element */

src/lib/core/overlay/overlay-state.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import {PositionStrategy} from './position/position-strategy';
22
import {LayoutDirection} from '../rtl/dir';
3-
import {ScrollStrategyOption} from './scroll/scroll-strategy-options';
3+
import {ScrollStrategy} from './scroll/scroll-strategy';
44

5-
export type OverlayStateScrollStrategy = {strategy: ScrollStrategyOption; config: any} |
6-
ScrollStrategyOption;
75

86
/**
97
* OverlayState is a bag of values for either the initial configuration or current state of an
@@ -14,7 +12,7 @@ export class OverlayState {
1412
positionStrategy: PositionStrategy;
1513

1614
/** Strategy to be used when handling scroll events while the overlay is open. */
17-
scrollStrategy: OverlayStateScrollStrategy;
15+
scrollStrategy: ScrollStrategy;
1816

1917
/** Custom class to add to the overlay pane. */
2018
panelClass: string = '';

src/lib/core/overlay/overlay.spec.ts

Lines changed: 9 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,7 @@ import {OverlayRef} from './overlay-ref';
99
import {PositionStrategy} from './position/position-strategy';
1010
import {OverlayModule} from './overlay-directives';
1111
import {ViewportRuler} from './position/viewport-ruler';
12-
import {
13-
ScrollStrategy,
14-
ScrollStrategyOptions,
15-
ScrollStrategyOption,
16-
ScrollDispatcher,
17-
} from './scroll/index';
12+
import {ScrollStrategy, ScrollDispatcher} from './scroll/index';
1813

1914

2015
describe('Overlay', () => {
@@ -27,22 +22,13 @@ describe('Overlay', () => {
2722
beforeEach(async(() => {
2823
TestBed.configureTestingModule({
2924
imports: [OverlayModule, PortalModule, OverlayTestModule],
30-
providers: [
31-
ScrollDispatcher,
32-
ViewportRuler,
33-
{
34-
provide: ScrollStrategyOptions,
35-
useClass: ScrollStrategyOptionsOverride,
36-
deps: [ScrollDispatcher, ViewportRuler]
37-
},
38-
{
39-
provide: OverlayContainer,
40-
useFactory: () => {
41-
overlayContainerElement = document.createElement('div');
42-
return {getContainerElement: () => overlayContainerElement};
43-
}
25+
providers: [{
26+
provide: OverlayContainer,
27+
useFactory: () => {
28+
overlayContainerElement = document.createElement('div');
29+
return {getContainerElement: () => overlayContainerElement};
4430
}
45-
]
31+
}]
4632
}).compileComponents();
4733
}));
4834

@@ -371,15 +357,10 @@ describe('Overlay', () => {
371357
let overlayRef: OverlayRef;
372358

373359
beforeEach(() => {
374-
});
375-
376-
beforeEach(inject([ScrollStrategyOptions], (scrollOptions: ScrollStrategyOptionsOverride) => {
377360
config = new OverlayState();
378-
config.scrollStrategy = scrollOptions.fake;
361+
fakeScrollStrategy = config.scrollStrategy = new FakeScrollStrategy();
379362
overlayRef = overlay.create(config);
380-
fakeScrollStrategy =
381-
scrollOptions.instances[scrollOptions.instances.length - 1] as FakeScrollStrategy;
382-
}));
363+
});
383364

384365
it('should attach the overlay ref to the scroll strategy', () => {
385366
expect(fakeScrollStrategy.overlayRef).toBe(overlayRef,
@@ -495,19 +476,3 @@ class FakeScrollStrategy implements ScrollStrategy {
495476
this.isEnabled = false;
496477
}
497478
}
498-
499-
500-
class ScrollStrategyOptionsOverride extends ScrollStrategyOptions {
501-
constructor(scrollDispatcher: ScrollDispatcher, viewportRuler: ViewportRuler) {
502-
super(scrollDispatcher, viewportRuler);
503-
}
504-
505-
// used for accessing the current instance in unit tests.
506-
public instances: ScrollStrategy[] = [];
507-
508-
fake: ScrollStrategyOption = () => {
509-
let instance = new FakeScrollStrategy();
510-
this.instances.push(instance);
511-
return instance;
512-
}
513-
}

src/lib/core/overlay/overlay.ts

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ let defaultState = new OverlayState();
3232
*/
3333
@Injectable()
3434
export class Overlay {
35-
constructor(private _overlayContainer: OverlayContainer,
35+
constructor(public scrollStrategies: ScrollStrategyOptions,
36+
private _overlayContainer: OverlayContainer,
3637
private _componentFactoryResolver: ComponentFactoryResolver,
3738
private _positionBuilder: OverlayPositionBuilder,
38-
private _scrollStrategyOptions: ScrollStrategyOptions,
3939
private _appRef: ApplicationRef,
4040
private _injector: Injector,
4141
private _ngZone: NgZone) { }
@@ -86,24 +86,10 @@ export class Overlay {
8686
* @param state
8787
*/
8888
private _createOverlayRef(pane: HTMLElement, state: OverlayState): OverlayRef {
89-
let scrollStrategy = this._createScrollStrategy(state);
89+
let scrollStrategy = state.scrollStrategy || this.scrollStrategies.noop();
9090
let portalHost = this._createPortalHost(pane);
9191
return new OverlayRef(portalHost, pane, state, scrollStrategy, this._ngZone);
9292
}
93-
94-
/**
95-
* Creates a scroll strategy for the given overlay state.
96-
* @param state
97-
*/
98-
private _createScrollStrategy(state: OverlayState): ScrollStrategy {
99-
if (state.scrollStrategy) {
100-
return typeof state.scrollStrategy === 'function' ?
101-
state.scrollStrategy() :
102-
state.scrollStrategy.strategy();
103-
}
104-
105-
return this._scrollStrategyOptions.noop();
106-
}
10793
}
10894

10995
/** Providers for Overlay and its related injectables. */

src/lib/core/overlay/scroll/block-scroll-strategy.spec.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
OverlayState,
1010
Overlay,
1111
OverlayRef,
12-
ScrollStrategyOptions,
1312
} from '../../core';
1413

1514

@@ -26,15 +25,14 @@ describe('BlockScrollStrategy', () => {
2625
}).compileComponents();
2726
}));
2827

29-
beforeEach(inject([Overlay, ViewportRuler, ScrollStrategyOptions],
30-
(o: Overlay, v: ViewportRuler, sso: ScrollStrategyOptions) => {
28+
beforeEach(inject([Overlay, ViewportRuler], (overlay: Overlay, viewportRuler: ViewportRuler) => {
3129
let overlayState = new OverlayState();
3230

33-
overlayState.scrollStrategy = sso.block;
34-
overlayRef = o.create(overlayState);
31+
overlayState.scrollStrategy = overlay.scrollStrategies.block();
32+
overlayRef = overlay.create(overlayState);
3533
componentPortal = new ComponentPortal(FocacciaMsg);
3634

37-
viewport = v;
35+
viewport = viewportRuler;
3836
forceScrollElement = document.createElement('div');
3937
document.body.appendChild(forceScrollElement);
4038
forceScrollElement.style.width = '100px';

src/lib/core/overlay/scroll/close-scroll-strategy.spec.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
OverlayModule,
1111
ScrollStrategy,
1212
ScrollDispatcher,
13-
ScrollStrategyOptions,
1413
} from '../../core';
1514

1615

@@ -34,10 +33,10 @@ describe('CloseScrollStrategy', () => {
3433
TestBed.compileComponents();
3534
}));
3635

37-
beforeEach(inject([Overlay, ScrollStrategyOptions], (o: Overlay, sso: ScrollStrategyOptions) => {
36+
beforeEach(inject([Overlay], (overlay: Overlay) => {
3837
let overlayState = new OverlayState();
39-
overlayState.scrollStrategy = sso.close;
40-
overlayRef = o.create(overlayState);
38+
overlayState.scrollStrategy = overlay.scrollStrategies.close();
39+
overlayRef = overlay.create(overlayState);
4140
componentPortal = new ComponentPortal(MozarellaMsg);
4241
}));
4342

src/lib/core/overlay/scroll/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export {ScrollDispatcher} from './scroll-dispatcher';
99

1010
// Export pre-defined scroll strategies and interface to build custom ones.
1111
export {ScrollStrategy} from './scroll-strategy';
12-
export {ScrollStrategyOptions, ScrollStrategyOption} from './scroll-strategy-options';
12+
export {ScrollStrategyOptions} from './scroll-strategy-options';
1313
export {RepositionScrollStrategy} from './reposition-scroll-strategy';
1414
export {CloseScrollStrategy} from './close-scroll-strategy';
1515
export {NoopScrollStrategy} from './noop-scroll-strategy';

src/lib/core/overlay/scroll/reposition-scroll-strategy.spec.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
OverlayModule,
1111
ScrollStrategy,
1212
ScrollDispatcher,
13-
ScrollStrategyOptions,
1413
} from '../../core';
1514

1615

@@ -34,10 +33,10 @@ describe('RepositionScrollStrategy', () => {
3433
TestBed.compileComponents();
3534
}));
3635

37-
beforeEach(inject([Overlay, ScrollStrategyOptions], (o: Overlay, sso: ScrollStrategyOptions) => {
36+
beforeEach(inject([Overlay], (overlay: Overlay) => {
3837
let overlayState = new OverlayState();
39-
overlayState.scrollStrategy = sso.reposition;
40-
overlayRef = o.create(overlayState);
38+
overlayState.scrollStrategy = overlay.scrollStrategies.reposition();
39+
overlayRef = overlay.create(overlayState);
4140
componentPortal = new ComponentPortal(PastaMsg);
4241
}));
4342

src/lib/core/overlay/scroll/reposition-scroll-strategy.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ export interface RepositionScrollStrategyConfig {
1616
export class RepositionScrollStrategy implements ScrollStrategy {
1717
private _scrollSubscription: Subscription|null = null;
1818
private _overlayRef: OverlayRef;
19-
private _config: RepositionScrollStrategyConfig;
2019

21-
constructor(private _scrollDispatcher: ScrollDispatcher) { }
20+
constructor(
21+
private _scrollDispatcher: ScrollDispatcher,
22+
private _config: RepositionScrollStrategyConfig) { }
2223

23-
attach(overlayRef: OverlayRef, config?: RepositionScrollStrategyConfig) {
24+
attach(overlayRef: OverlayRef) {
2425
if (this._overlayRef) {
2526
throw getMdScrollStrategyAlreadyAttachedError();
2627
}
2728

2829
this._overlayRef = overlayRef;
29-
this._config = config;
3030
}
3131

3232
enable() {
Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import {Injectable} from '@angular/core';
22
import {ScrollStrategy} from './scroll-strategy';
3-
import {RepositionScrollStrategy} from './reposition-scroll-strategy';
43
import {CloseScrollStrategy} from './close-scroll-strategy';
54
import {NoopScrollStrategy} from './noop-scroll-strategy';
65
import {BlockScrollStrategy} from './block-scroll-strategy';
76
import {ScrollDispatcher} from './scroll-dispatcher';
87
import {ViewportRuler} from '../position/viewport-ruler';
9-
10-
export type ScrollStrategyOption = () => ScrollStrategy;
8+
import {
9+
RepositionScrollStrategy,
10+
RepositionScrollStrategyConfig,
11+
} from './reposition-scroll-strategy';
1112

1213

1314
/**
@@ -20,8 +21,10 @@ export class ScrollStrategyOptions {
2021
private _scrollDispatcher: ScrollDispatcher,
2122
private _viewportRuler: ViewportRuler) { }
2223

23-
noop: ScrollStrategyOption = () => new NoopScrollStrategy();
24-
close: ScrollStrategyOption = () => new CloseScrollStrategy(this._scrollDispatcher);
25-
block: ScrollStrategyOption = () => new BlockScrollStrategy(this._viewportRuler);
26-
reposition: ScrollStrategyOption = () => new RepositionScrollStrategy(this._scrollDispatcher);
24+
noop = () => new NoopScrollStrategy();
25+
close = () => new CloseScrollStrategy(this._scrollDispatcher);
26+
block = () => new BlockScrollStrategy(this._viewportRuler);
27+
reposition = (config?: RepositionScrollStrategyConfig) => {
28+
return new RepositionScrollStrategy(this._scrollDispatcher, config);
29+
}
2730
}

0 commit comments

Comments
 (0)