@@ -117,8 +117,9 @@ export class MdSlider implements ControlValueAccessor {
117
117
118
118
private _controlValueAccessorChangeFn : ( value : any ) => void = ( ) => { } ;
119
119
120
- /** The last value for which a change event was emitted. */
121
- private _lastEmittedValue : number = null ;
120
+ /** The last values for which a change or input event was emitted. */
121
+ private _lastChangeValue : number = null ;
122
+ private _lastInputValue : number = null ;
122
123
123
124
/** onTouch function registered via registerOnTouch (ControlValueAccessor). */
124
125
onTouched : ( ) => any = ( ) => { } ;
@@ -301,6 +302,9 @@ export class MdSlider implements ControlValueAccessor {
301
302
/** Event emitted when the slider value has changed. */
302
303
@Output ( ) change = new EventEmitter < MdSliderChange > ( ) ;
303
304
305
+ /** Event emitted when the slider thumb moves. */
306
+ @Output ( ) input = new EventEmitter < MdSliderChange > ( ) ;
307
+
304
308
constructor ( @Optional ( ) private _dir : Dir , elementRef : ElementRef ) {
305
309
this . _renderer = new SliderRenderer ( elementRef ) ;
306
310
}
@@ -325,6 +329,9 @@ export class MdSlider implements ControlValueAccessor {
325
329
this . _isSliding = false ;
326
330
this . _renderer . addFocus ( ) ;
327
331
this . _updateValueFromPosition ( { x : event . clientX , y : event . clientY } ) ;
332
+
333
+ /* Emits a change and input event if the value changed. */
334
+ this . _emitInputEvent ( ) ;
328
335
this . _emitValueIfChanged ( ) ;
329
336
}
330
337
@@ -336,6 +343,9 @@ export class MdSlider implements ControlValueAccessor {
336
343
// Prevent the slide from selecting anything else.
337
344
event . preventDefault ( ) ;
338
345
this . _updateValueFromPosition ( { x : event . center . x , y : event . center . y } ) ;
346
+
347
+ // Native range elements always emit `input` events when the value changed while sliding.
348
+ this . _emitInputEvent ( ) ;
339
349
}
340
350
341
351
_onSlideStart ( event : HammerInput ) {
@@ -439,16 +449,23 @@ export class MdSlider implements ControlValueAccessor {
439
449
440
450
/** Emits a change event if the current value is different from the last emitted value. */
441
451
private _emitValueIfChanged ( ) {
442
- if ( this . value != this . _lastEmittedValue ) {
443
- let event = new MdSliderChange ( ) ;
444
- event . source = this ;
445
- event . value = this . value ;
446
- this . _lastEmittedValue = this . value ;
452
+ if ( this . value != this . _lastChangeValue ) {
453
+ let event = this . _createChangeEvent ( ) ;
454
+ this . _lastChangeValue = this . value ;
447
455
this . _controlValueAccessorChangeFn ( this . value ) ;
448
456
this . change . emit ( event ) ;
449
457
}
450
458
}
451
459
460
+ /** Emits an input event when the current value is different from the last emitted value. */
461
+ private _emitInputEvent ( ) {
462
+ if ( this . value != this . _lastInputValue ) {
463
+ let event = this . _createChangeEvent ( ) ;
464
+ this . _lastInputValue = this . value ;
465
+ this . input . emit ( event ) ;
466
+ }
467
+ }
468
+
452
469
/** Updates the amount of space between ticks as a percentage of the width of the slider. */
453
470
private _updateTickIntervalPercent ( ) {
454
471
if ( ! this . tickInterval ) {
@@ -466,6 +483,16 @@ export class MdSlider implements ControlValueAccessor {
466
483
}
467
484
}
468
485
486
+ /** Creates a slider change object from the specified value. */
487
+ private _createChangeEvent ( value = this . value ) : MdSliderChange {
488
+ let event = new MdSliderChange ( ) ;
489
+
490
+ event . source = this ;
491
+ event . value = value ;
492
+
493
+ return event ;
494
+ }
495
+
469
496
/** Calculates the percentage of the slider that a value is. */
470
497
private _calculatePercentage ( value : number ) {
471
498
return ( value - this . min ) / ( this . max - this . min ) ;
0 commit comments