I am using an Angular Material mat-slider with a range selection (start and end thumbs). I want to format the labels so that:
The start thumb displays: "Min: (value)"
The end thumb displays: "Max: (value)"
However, the displayWith function (formatSlideRangeLabel) only receives a single value, so I cannot differentiate between the start and end thumbs. My Code:
<mat-slider class="ai-basic-slider"
id="inserted-media-range"
min="0" max="51" step="1"
discrete showTickMarks
[displayWith]="formatSlideRangeLabel">
<input matSliderStartThumb>
<input matSliderEndThumb>
</mat-slider>
public formatSlideRangeLabel(value: number): string {
if (value == 51) {
return 'Max: ∞';
} else {
return 'Max: ' + value;
}
return `${value}`;
}
First bind the min and max values to local properties.
<input matSliderStartThumb [(ngModel)]="min" />
<input matSliderEndThumb [(ngModel)]="max" />
Then all you need to do is check if the value from the displayWith is equal to min value that is binded using ngModel, if the values are equal then it's the min value you are dealing with.
public formatSlideRangeLabel(value: number): string {
if (value === this.min()) {
// then it is max
return 'Min: ' + value;
} else {
if (value == 51) {
return 'Max: ∞';
} else {
return 'Max: ' + value;
}
}
}
To access this.min(), you have to make sure that function is executed in the component context, to achieve this, we use .bind(this).
<mat-slider
class="ai-basic-slider"
id="inserted-media-range"
min="0"
max="51"
step="1"
discrete
showTickMarks
[displayWith]="formatSlideRangeLabel.bind(this)"
>
<input matSliderStartThumb [(ngModel)]="min" />
<input matSliderEndThumb [(ngModel)]="max" />
</mat-slider>
import { Component, model } from '@angular/core';
import { MatSliderModule } from '@angular/material/slider';
import { FormsModule } from '@angular/forms';
/**
* @title Range slider
*/
@Component({
selector: 'slider-range-example',
templateUrl: 'slider-range-example.html',
styleUrl: 'slider-range-example.css',
imports: [MatSliderModule, FormsModule],
})
export class SliderRangeExample {
min = model(0);
max = model(0);
public formatSlideRangeLabel(value: number): string {
if (value === this.min()) {
// then it is max
return 'Min: ' + value;
} else {
if (value == 51) {
return 'Max: ∞';
} else {
return 'Max: ' + value;
}
}
}
}