Skip to content

Commit 3bae800

Browse files
timsawyerjelbourn
authored andcommitted
fix(material/slider): inject document token (#18275)
Update Angular Material `slider` component to inject reference to document instead of accessing global variable. This allows for rendering the slider in contexts where the document is dynamically provided. This change follows the pattern used in Cdk OverlayContainer.
1 parent 9459f5b commit 3bae800

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

src/material/slider/slider.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import {
5757
} from '@angular/material/core';
5858
import {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';
5959
import {normalizePassiveListenerOptions} from '@angular/cdk/platform';
60+
import {DOCUMENT} from '@angular/common';
6061
import {Subscription} from 'rxjs';
6162

6263
const activeEventOptions = normalizePassiveListenerOptions({passive: false});
@@ -488,6 +489,9 @@ export class MatSlider extends _MatSliderMixinBase
488489
/** Keeps track of the last pointer event that was captured by the slider. */
489490
private _lastPointerEvent: MouseEvent | TouchEvent | null;
490491

492+
/** Used to subscribe to global move and end events */
493+
protected _document?: Document;
494+
491495
constructor(elementRef: ElementRef,
492496
private _focusMonitor: FocusMonitor,
493497
private _changeDetectorRef: ChangeDetectorRef,
@@ -496,9 +500,13 @@ export class MatSlider extends _MatSliderMixinBase
496500
// @breaking-change 8.0.0 `_animationMode` parameter to be made required.
497501
@Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string,
498502
// @breaking-change 9.0.0 `_ngZone` parameter to be made required.
499-
private _ngZone?: NgZone) {
503+
private _ngZone?: NgZone,
504+
/** @breaking-change 11.0.0 make document required */
505+
@Optional() @Inject(DOCUMENT) document?: any) {
500506
super(elementRef);
501507

508+
this._document = document;
509+
502510
this.tabIndex = parseInt(tabIndex) || 0;
503511

504512
this._runOutsizeZone(() => {
@@ -696,8 +704,8 @@ export class MatSlider extends _MatSliderMixinBase
696704
* as they're swiping across the screen.
697705
*/
698706
private _bindGlobalEvents(triggerEvent: TouchEvent | MouseEvent) {
699-
if (typeof document !== 'undefined' && document) {
700-
const body = document.body;
707+
if (typeof this._document !== 'undefined' && this._document) {
708+
const body = this._document.body;
701709
const isTouch = isTouchEvent(triggerEvent);
702710
const moveEventName = isTouch ? 'touchmove' : 'mousemove';
703711
const endEventName = isTouch ? 'touchend' : 'mouseup';
@@ -715,8 +723,8 @@ export class MatSlider extends _MatSliderMixinBase
715723

716724
/** Removes any global event listeners that we may have added. */
717725
private _removeGlobalEvents() {
718-
if (typeof document !== 'undefined' && document) {
719-
const body = document.body;
726+
if (typeof this._document !== 'undefined' && this._document) {
727+
const body = this._document.body;
720728
body.removeEventListener('mousemove', this._pointerMove, activeEventOptions);
721729
body.removeEventListener('mouseup', this._pointerUp, activeEventOptions);
722730
body.removeEventListener('touchmove', this._pointerMove, activeEventOptions);

tools/public_api_guard/material/slider.d.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export declare const MAT_SLIDER_VALUE_ACCESSOR: any;
22

33
export declare class MatSlider extends _MatSliderMixinBase implements ControlValueAccessor, OnDestroy, CanDisable, CanColor, OnInit, HasTabIndex {
44
_animationMode?: string | undefined;
5+
protected _document?: Document;
56
get _invertAxis(): boolean;
67
_isActive: boolean;
78
get _isMinValue(): boolean;
@@ -45,7 +46,8 @@ export declare class MatSlider extends _MatSliderMixinBase implements ControlVal
4546
readonly valueChange: EventEmitter<number | null>;
4647
get vertical(): boolean;
4748
set vertical(value: boolean);
48-
constructor(elementRef: ElementRef, _focusMonitor: FocusMonitor, _changeDetectorRef: ChangeDetectorRef, _dir: Directionality, tabIndex: string, _animationMode?: string | undefined, _ngZone?: NgZone | undefined);
49+
constructor(elementRef: ElementRef, _focusMonitor: FocusMonitor, _changeDetectorRef: ChangeDetectorRef, _dir: Directionality, tabIndex: string, _animationMode?: string | undefined, _ngZone?: NgZone | undefined,
50+
document?: any);
4951
_onBlur(): void;
5052
_onFocus(): void;
5153
_onKeydown(event: KeyboardEvent): void;

0 commit comments

Comments
 (0)