Skip to content

Commit 401f286

Browse files
authored
Merge pull request #6412 from IgniteUI/slider-valueChanged
feat(slider): expose onValueChanged event
2 parents 7e91e63 + d009682 commit 401f286

File tree

4 files changed

+47
-19
lines changed

4 files changed

+47
-19
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ All notable changes for each version of this project will be documented in this
6868
- `tickLabelsOrientation` input was added. Allows you to change the rotation of all tick labels from horizontal to vertical(toptobottom, bottomtotop).
6969
- `igxSliderTickLabel` directive has been introduced. Allows you to set a custom template for all tick labels.
7070
- `isContinuous` - input has been deleted. The option is not supported anymore.
71+
- `onValueChanged` - new output has been exposed. This event is emitted at the end of every slide interaction.
7172

7273
- `IgxCarousel`:
7374
- `keyboardSupport` input is added, which can be used to enable and disable keyboard navigation

projects/igniteui-angular/src/lib/slider/slider.common.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export interface IRangeSliderValue {
4848
upper: number;
4949
}
5050

51-
export interface ISliderValueChangeEventArgs extends IBaseEventArgs {
51+
export interface ISliderValueChangeEventArgs {
5252
oldValue: number | IRangeSliderValue;
5353
value: number | IRangeSliderValue;
5454
}

projects/igniteui-angular/src/lib/slider/slider.component.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,6 +1326,34 @@ describe('IgxSlider', () => {
13261326
expect(slider.lowerBound).toEqual(expectedMinVal);
13271327
expect(slider.upperBound).toEqual(expectedMaxVal);
13281328
});
1329+
1330+
it('Should emit onValueChanged only when stop interacting with the slider', () => {
1331+
const fix = TestBed.createComponent(SliderTestComponent);
1332+
fix.detectChanges();
1333+
1334+
const instance = fix.componentInstance;
1335+
const spyOnValueChanged = spyOn<any>(instance.slider.onValueChanged, 'emit').and.callThrough();
1336+
const sliderEl = fix.debugElement.query(By.css(SLIDER_CLASS));
1337+
sliderEl.triggerEventHandler('focus', null);
1338+
fix.detectChanges();
1339+
1340+
sliderEl.triggerEventHandler('pointerdown', {pointerId: 1, clientX: 200, preventDefault: <any>( ( e: any ) => { })});
1341+
fix.detectChanges();
1342+
let currentValue = instance.slider.value;
1343+
expect(spyOnValueChanged).toHaveBeenCalledTimes(0);
1344+
expect(currentValue).toBeGreaterThan(0);
1345+
1346+
sliderEl.triggerEventHandler('pointerdown', {pointerId: 1, clientX: 300, preventDefault: <any>( ( e: any ) => { })});
1347+
fix.detectChanges();
1348+
expect(spyOnValueChanged).toHaveBeenCalledTimes(0);
1349+
expect(instance.slider.value).toBeGreaterThan(currentValue as number);
1350+
1351+
currentValue = instance.slider.value;
1352+
sliderEl.triggerEventHandler('pointerup', {pointerId: 1, preventDefault: <any>( ( e: any ) => { })});
1353+
fix.detectChanges();
1354+
expect(spyOnValueChanged).toHaveBeenCalledTimes(1);
1355+
expect(instance.slider.value).toEqual(currentValue);
1356+
});
13291357
});
13301358

13311359
describe('igxSlider ticks', () => {

projects/igniteui-angular/src/lib/slider/slider.component.ts

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ export class IgxSliderComponent implements
740740
}
741741

742742
/**
743-
* This event is emitted when user has stopped interacting the thumb and value is changed.
743+
* This event is emitted every time the value is changed.
744744
* ```typescript
745745
* public change(event){
746746
* alert("The value has been changed!");
@@ -753,6 +753,20 @@ export class IgxSliderComponent implements
753753
@Output()
754754
public onValueChange = new EventEmitter<ISliderValueChangeEventArgs>();
755755

756+
/**
757+
* This event is emitted at the end of every slide interaction.
758+
* ```typescript
759+
* public change(event){
760+
* alert("The value has been changed!");
761+
*}
762+
* ```
763+
* ```html
764+
* <igx-slider (onValueChanged)="change($event)" #slider [(ngModel)]="task.percentCompleted" [step]="5">
765+
* ```
766+
*/
767+
@Output()
768+
public onValueChanged = new EventEmitter<number | IRangeSliderValue>();
769+
756770

757771
constructor(
758772
private renderer: Renderer2,
@@ -782,7 +796,7 @@ export class IgxSliderComponent implements
782796
* @hidden
783797
*/
784798
@HostListener('pointerup', ['$event'])
785-
public onPointerUp($event) {
799+
public onPointerUp($event: PointerEvent) {
786800
if (!this.thumbTo.isActive && this.thumbFrom === undefined) {
787801
return;
788802
}
@@ -791,6 +805,7 @@ export class IgxSliderComponent implements
791805
activeThumb.nativeElement.releasePointerCapture($event.pointerId);
792806

793807
this.hideSliderIndicators();
808+
this.onValueChanged.emit(this.value);
794809
}
795810

796811
/**
@@ -809,22 +824,6 @@ export class IgxSliderComponent implements
809824
this.update($event.srcEvent.clientX);
810825
}
811826

812-
/**
813-
* @hidden
814-
*/
815-
@HostListener('panstart')
816-
public onPanStart() {
817-
this.showSliderIndicators();
818-
}
819-
820-
/**
821-
* @hidden
822-
*/
823-
@HostListener('panend')
824-
public onPanEnd() {
825-
this.hideSliderIndicators();
826-
}
827-
828827
/**
829828
*Returns whether the `IgxSliderComponent` type is RANGE.
830829
*```typescript

0 commit comments

Comments
 (0)