J'essaie de construire des services "utilitaires" (classes) pour un projet angulaire. Les classes utilitaires ont des fonctions statiques (pour ne pas avoir à instancier des objets inutiles). Voici un exemple :
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;
}
}
}
Dans mon fichier de classe de composant, je l'importe ensuite comme suit :
import { DateService } from '../utilities/date.service';
et dans la classe, un code comme celui-ci fonctionne :
ngOnInit():void {
let temp = DateService.parseDate("2012/07/30");
console.log(temp); // Mon Jul 30 2012 00:00:00 GMT-0500 (Central Daylight Time)
}
Cependant, j'aimerais pouvoir utiliser ces fonctions utilitaires dans le modèle html angulaire, comme suit :
<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">
Malheureusement, cela ne fonctionne pas ; cela donne une erreur "Cannot read property 'parseDate' of undefined".
Maintenant, je peux déplacer la fonction "parseDate" vers la classe du composant, et cela fonctionne bien (avec le changement nécessaire dans le modèle, bien sûr)... cependant, si j'ai un tas de composants, ils devront tous avoir leur propre fonction "parseDate" et je pense que nous savons tous que c'est une mauvaise idée qui ne s'adapte pas bien. (veuillez ignorer la nature triviale de la fonction parseDate)
De plus, même si je ne souhaite pas vraiment instancier un objet juste pour exécuter une fonction statique, j'essaie de le faire avec une injection de dépendance réelle. Je l'ajoute au tableau des fournisseurs, et je construis une instance dans le constructeur - comme ceci :
constructor(private _dateService: DateService) { }
et ensuite changer mon modèle en :
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">
Cela échoue également, cette fois avec une erreur "self.context._dateService.parseDate is not a function". En supprimant le "static" de la fonction, le problème est résolu et je peux passer à autre chose, mais je dois toujours instancier quelque chose juste pour exécuter ce que j'ai fait. debe être une simple fonction statique. Il existe sûrement une meilleure solution.
Qu'en pensez-vous ?
0 votes
Vous pouvez créer un tube personnalisé pour éviter d'avoir à appeler la fonction statique dans le modèle.
0 votes
Si vous allez injecter un service, alors pourquoi utiliser le mot-clé static ? Qu'y a-t-il de mal à traiter une seule instance du service ?