Я пытаюсь построить сервисы (классы) "утилиты" для проекта angular. Классы полезности имеют статические функции (поэтому нам не нужно создавать ненужные объекты). Один из примеров:
import { Injectable } from '@angular/core';
@Injectable()
export class DateService {
constructor() {
}
public static parseDate(dateString: string): Date {
if (dateString) {
return new Date(dateString);
} else {
return null;
}
}
}
В моем файле класса компонентов я затем импортирую его так:
import { DateService } from '../utilities/date.service';
и внутри кода класса, как это работает:
ngOnInit():void {
let temp = DateService.parseDate("2012/07/30");
console.log(temp); // Mon Jul 30 2012 00:00:00 GMT-0500 (Central Daylight Time)
}
Однако я хотел бы иметь возможность использовать эти служебные функции в шаблоне angular html, например:
<label for="date">Date</label>
<input type="date" class="form-control" id="date" required
[value]="event.date | date: 'yyyy-MM-dd'" (input)="event.date=DateService.parseDate($event.target.value)" name="date">
К сожалению, это не работает; давая ошибку "Невозможно прочитать свойство" parseDate "из undefined".
Теперь я могу переместить функцию parseDate в класс компонента, и это отлично работает (с необходимым изменением в шаблоне, конечно)... однако, если у меня есть куча компонентов, они бы все должны иметь свою собственную функцию parseDate, и я думаю, что мы все знаем, что плохая идея, которая плохо масштабируется. (пожалуйста, игнорируйте тривиальный характер функции parseDate)
Кроме того, несмотря на то, что я действительно не хочу создавать экземпляр объекта только для запуска статической функции, я пробую его с фактической инъекцией зависимостей. Добавьте его в массив поставщиков и создайте экземпляр в конструкторе - например:
constructor(private _dateService: DateService) { }
а затем изменив мой шаблон на:
label for="date">Date</label>
<input type="date" class="form-control" id="date" required
[value]="event.date | date: 'yyyy-MM-dd'" (input)="event.date=_dateService.parseDate($event.target.value)" name="date">
Это также не удается, на этот раз с ошибкой "self.context._dateService.parseDate не является функцией". Удаление "статики" из функции устраняет проблему, и я могу двигаться дальше, но мне все еще нужно создавать что-то просто для запуска, что должно быть только статической функцией. Конечно, есть лучший способ.
Мысли?