FullCalendar possède un module complémentaire appelé Scheduler que j'essaie d'utiliser avec le composant PrimeNG-Schedule. En regardant la documentation de PrimeNG, il y a une propriété 'options' que je peux utiliser pour envoyer des informations arbitraires à FullCalendar. Cela fonctionne, mais lorsque je connecte la récupération des données à une API asynchrone, cela pose des problèmes.
L'API utilise des observables auxquels je m'abonne dans le composant. Cela fonctionne bien pour les événements car la vue est mise à jour automatiquement lorsque les événements sont modifiés.
Cependant, lorsque l'on fournit des "ressources" au calendrier complet via la propriété PrimeNG "options", les choses ne fonctionnent pas comme prévu car le code permettant de définir la propriété "options" est exécuté avant que l'appel à l'API n'ait eu le temps de revenir et est donc vide.
J'en suis sûr parce que si je code en dur les ressources, les choses fonctionnent.
Je pense qu'il y a plusieurs façons de remédier à ce problème :
-
Rendre les appels synchrones (j'aimerais éviter cela)
-
Attendre que toutes les données soient chargées, puis (re)rendre la vue (ce qui revient à peu près au même que le point 1)
-
Configurer la propriété options.resources de telle sorte que lorsqu'elle change, la vue soit mise à jour, comme pour les événements (c'est la meilleure option, mais je ne suis pas sûr qu'elle soit possible).
J'apprécierais toute aide. Je vous remercie de votre aide.
<p-schedule
[events]="events"
[businessHours]="businessHours"
[options]="optionConfig"
>
</p-schedule>
Mon API (pour l'instant) factice
getEvents() {
return this.http
.get('assets/api/mockEvents.json')
.map((response : Response) => <Appointment[]>response.json().data)
.catch(this.handleError);
}
getResources() {
return this.http
.get('assets/api/mockResources.json')
.map((response : Response) => <Resource[]>response.json().data)
.catch(this.handleError);
}
Fichier de composants
ngOnInit() {
this.schedulerService.getEvents()
.subscribe(events=> this.events = events);
this.schedulerService.getResources()
.subscribe(resources => this.resources = resources);
// ***** If the following code is uncommented, resources are displayed in Schedule view ****
// this.resources = [
// new Resource(1, "Dr. Hibbert", "blue", true, new BusinessHours("08:00", "16:00")),
// new Resource(2, "Dr. Simpson", "green", true, new BusinessHours("10:00", "18:00"))
// ];
this.optionConfig = {
"resources": this.resources
}
}
Editer : Une chose à laquelle j'ai pensé est de régler le this.resources
uniquement via sa méthode setter. De cette façon, je sais exactement quand la valeur est définie, mais le problème reste entier : comment puis-je transmettre la nouvelle valeur au composant de planification ? après il a été initialisé.