Je suis en train d'apprendre AngularJS, venant de beaucoup de frameworks MV* différents. J'aime ce framework, mais j'ai du mal à faire passer les données entre les contrôleurs.
Supposons que j'ai un écran avec une entrée (input.html) et un contrôleur, disons InputCtrl.
Il y a un bouton sur cette vue qui vous amène à un autre écran, disons d'approbation (approve.html) avec un contrôleur ApproveCtrl.
Cette ApproveCtrl a besoin des données de l'InputCtrl. Il s'agit d'un scénario très courant dans les grandes applications.
Dans mes précédents frameworks MV*, ceci était géré comme (pseudo-code) :
var self = this;
onClick = function() {
var approveCtrl = DI.resolve(ApproveCtrl);
approveCtrl.property1 = self.property1;
approveCtrl.property1 = self.property2;
self.router.show(approveCtrl);
}
- Cela fonctionnerait comme Controller- first. Vous créez d'abord le contrôleur, en ayant la possibilité de le mettre dans le bon état ; ensuite, la vue est créée.
Maintenant, dans AngularJS, je gère cela de la façon suivante :
var self = this;
onClick = function(){
self.$locationService.path('approve');
}
- Cela fonctionne comme le View-first. Vous dites à quelle vue / route vous devez naviguer, le contrôleur est créé par le framework.
Je trouve difficile de contrôler l'état du contrôleur créé et de lui transmettre des données. J'ai vu et essayé les approches suivantes, mais toutes ont leurs propres problèmes à mon avis :
- Injecter un service partagé dans InputCtrl & ApproveCtrl et mettre toutes les données à partager sur ce service.
- Cela semble être une mauvaise solution ; l'état du service partagé devient un état global, alors que j'en ai juste besoin pour transmettre des données à l'ApproveCtrl.
- La durée de vie de ce service partagé est bien plus longue que ce dont j'ai besoin - juste pour transmettre des données à l'ApproveCtrl.
- Passer les données dans $routeParams
- Cela devient assez compliqué lorsque l'on doit passer beaucoup de paramètres.
- Utiliser les événements $scope
- Conceptuellement, ce n'est pas quelque chose pour lequel j'utiliserais des événements - j'ai juste besoin de passer des données à l'ApproveCtrl, rien d'événementiel.
- C'est assez compliqué ; je dois d'abord envoyer un événement au parent, qui le diffusera ensuite à ses enfants.
Est-ce que je rate quelque chose ? Est-ce que je crée trop de petits contrôleurs ?
Est-ce que j'essaie trop de m'accrocher aux habitudes des autres cadres ici ?
Merci pour votre temps,
Koen