Вот возможный подход.
Сначала я сохраняю данные бэкэнда как они есть.
Затем я создам объект с внутренними данными в качестве значения и отображаемым текстом на основе значения.Например, для элемента бэкэнд-массива '09-12'
я создаю объект {value:'09-12', text: '9am-12pm'}
Ваш файл ts:
backendData = ["09-12", "12-15", "15-18", "18-21"] //Data from the backend
appt_timeslots = [] //This will be our object
//I do the rest in ngOnInit but that's just for the example.
ngOnInit() {
this.backendData.forEach(e => {
var text = this.getTextFromValue(e);
this.appt_timeslots.push({value: e, text: text});
})
console.log(this.appt_timeslots);
}
getTextFromValue(value:string){
var timeSlots = value.split("-");
var formattedTime = timeSlots.map(time => {
time = this.setAMorPM(time);
return time
});
var result = formattedTime.join("-")
return result
}
setAMorPM(number: string){
if(parseInt(number) > 12)
number = (parseInt(number) - 12).toString() + 'pm';
else
if(parseInt(number) == 0)
number = "12am"
else
if(number[0]=='0')
{
number = number.slice(1);
number += 'am';
}
return number
}
Мы создаем объект на основе данных бэкэнда для каждого элементаи поместите его в массив объектов (appt_timeslots
).
Две функции getTextFromValue()
и toAMorPM()
служат только для создания текста на основе значения, я разделил их для удобства чтения.
Ваш HTML-файл:
Теперь вам просто нужно пройтись по массиву объектов и, при необходимости, интерполировать значение или текст, например:
<ng-container *ngFor="let appt of appt_timeslots" [ngSwitch]="appt.value">
<label ngbButtonLabel class="btn btn-secondary active btn-radio btn-color">
<input ngbButton type="radio" name="timeslot" value="{{ appt.value }}"/>
<span *ngSwitchCase="appt.value">{{appt.text}}</span>
</label>
</ng-container>
Примечание. Функции, вероятно, могут быть написаны более кратко, ноЯ думаю, что подход имеет смысл.