J'ai un contrôleur de base qui affiche mes produits,
App.controller('ProductCtrl',function($scope,$productFactory){
$productFactory.get().success(function(data){
$scope.products = data;
});
});
À mon avis, j'affiche ces produits dans une liste
<ul>
<li ng-repeat="product as products">
{{product.name}}
</li>
</ul
Ce que j'essaie de faire, c'est quand quelqu'un clique sur le nom du produit, j'ai une autre vue nommée panier où ce produit est ajouté.
<ul class="cart">
<li>
//click one added here
</li>
<li>
//click two added here
</li>
</ul>
Donc, mon doute ici est, comment faire passer ces produits cliqués du premier contrôleur au second? J'ai supposé que le chariot devrait également être un contrôleur.
Je gère l'événement click en utilisant la directive. De plus, je pense que je devrais utiliser le service pour atteindre les fonctionnalités ci-dessus, je ne sais pas comment? parce que le panier sera prédéfini, le nombre de produits ajoutés pourrait être de 5/10 en fonction de l'utilisateur de la page. Je voudrais donc garder ce générique.
Mettre à jour:
J'ai créé un service pour diffuser et dans le deuxième contrôleur je le reçois. Maintenant, la question est de savoir comment mettre à jour dom? Étant donné que ma liste de produits à déposer est assez codée en dur.
la source
Réponses:
D'après la description, il semble que vous devriez utiliser un service. Consultez http://egghead.io/lessons/angularjs-sharing-data-between-controllers et AngularJS Service Passing Data Between Controllers pour voir quelques exemples.
Vous pouvez définir votre service produit (en tant qu'usine) comme tel:
La dépendance injecte le service dans les deux contrôleurs.
Dans votre
ProductController
, définissez une action qui ajoute l'objet sélectionné au tableau:Dans votre
CartController
, obtenez les produits du service:la source
$http
appel, par exemple).Au clic, vous pouvez appeler la méthode qui appelle la diffusion :
et le deuxième contrôleur écoutera sur cette balise comme:
Comme nous ne pouvons pas injecter $ scope dans les services, rien de tel qu'un $ singleton scope.
Mais nous pouvons injecter
$rootScope
. Donc, si vous stockez de la valeur dans le service, vous pouvez l'exécuter$rootScope.$broadcast('SOME_TAG', 'your value');
dans le corps du service. (Voir la description de @Charx sur les services)Veuillez consulter un bon article sur $ broadcast , $ emit
la source
$rootScope.$broadcast
avertit tous les contrôleurs qui ont une structure parallèle aka le même niveau.$watch
si la valeur existe au$rootScope
niveau. Sinon, seule la diffusion risque d'avertir les autres contrôleurs. Pour info, si un autre programmeur voit dans votre codebroadcast
- la logique est claire ce que vous essayez de faire - "événement diffusé". Quoi qu'il en soit, de mon exp. son pas une bonne pratique à utiliserrootscope
pourwatch
. A propos de "Fire 1st time only": jetez un œil à cet exemple: plnkr.co/edit/5zqkj7iYloeHYkzK1Prt?p=preview vous avez d'anciennes et de nouvelles valeurs. assurez-vous que chaque fois que vous obtenez une nouvelle valeur qui ne correspond pas à l'ancienneSolution sans créer de service, en utilisant $ rootScope:
Pour partager des propriétés entre les contrôleurs d'application, vous pouvez utiliser Angular $ rootScope. Il s'agit d'une autre option pour partager des données, en les mettant à la disposition des utilisateurs.
Les services préférés pour partager certaines fonctionnalités entre les contrôleurs sont les services, pour lire ou modifier une propriété globale, vous pouvez utiliser $ rootscope.
Utilisation de $ rootScope dans un modèle (Accéder aux propriétés avec $ root):
la source
$rootScope
doit être évité autant que possible.Vous pouvez le faire par deux méthodes.
En utilisant
$rootscope
, mais je ne le recommande pas. C'est$rootScope
la portée la plus élevée. Une application ne peut en avoir qu'une$rootScope
qui sera partagée entre tous les composants d'une application. Il agit donc comme une variable globale.Utiliser des services. Vous pouvez le faire en partageant un service entre deux contrôleurs. Le code de service peut ressembler à ceci:
Vous pouvez voir mon violon ici .
la source
Un moyen encore plus simple de partager les données entre les contrôleurs consiste à utiliser des structures de données imbriquées. Au lieu de, par exemple
on peut utiliser
La
data
propriété sera héritée de la portée parent afin que nous puissions remplacer ses champs, en gardant l'accès aux autres contrôleurs.la source
la source
nous pouvons stocker des données en session et les utiliser n'importe où dans notre programme.
Autre endroit
la source
J'ai vu les réponses ici, et cela répond à la question du partage des données entre les contrôleurs, mais que dois-je faire si je veux qu'un contrôleur informe l'autre du fait que les données ont été modifiées (sans utiliser la diffusion)? FACILE! En utilisant simplement le célèbre modèle de visiteur:
De cette manière simple, un contrôleur peut mettre à jour un autre contrôleur que certaines données ont été mises à jour.
la source
J'ai créé une fabrique qui contrôle la portée partagée entre le modèle du chemin de l'itinéraire, afin que vous puissiez conserver les données partagées juste lorsque les utilisateurs naviguent dans le même chemin parent de l'itinéraire.
Ainsi, si l'utilisateur accède à un autre chemin de l'itinéraire, par exemple «/ Support», les données partagées pour le chemin «/ Client» seront automatiquement détruites. Mais, si au lieu de cela, l'utilisateur va sur les chemins «enfants», comme «/ Customer / 1» ou «/ Customer / list», la portée ne sera pas détruite.
Vous pouvez voir un exemple ici: http://plnkr.co/edit/OL8of9
la source
1
2
Au clic, vous pouvez appeler la méthode qui appelle la diffusion:
3
4
5
Une façon d'utiliser le service angulaire:
la source
Créez une usine dans votre module et ajoutez une référence de l'usine dans le contrôleur et utilisez ses variables dans le contrôleur et obtenez maintenant la valeur des données dans un autre contrôleur en ajoutant une référence où vous le souhaitez
la source
Je ne sais pas si cela aidera quelqu'un, mais sur la base de la réponse de Charx (merci!), J'ai créé un service de cache simple. N'hésitez pas à utiliser, remixer et partager:
la source
Une façon d'utiliser le service angulaire:
https://jsfiddle.net/1w64222q/
la source
FYI L'objet $ scope a le $ emit, $ broadcast, $ on ET l'objet $ rootScope a le $ emit, $ broadcast, $ on identique
en savoir plus sur le modèle de conception de publication / abonnement en angulaire ici
la source
Pour améliorer la solution proposée par @Maxim en utilisant $ broadcast, envoyer des données ne change pas
mais aux données d'écoute
la source
Il y a trois façons de le faire,
a) utiliser un service
b) Exploiter la relation parent / enfant dépendante entre les portées du contrôleur.
c) Dans Angular 2.0, le mot clé "As" transmettra les données d'un contrôleur à un autre.
Pour plus d'informations avec exemple, veuillez vérifier le lien ci-dessous:
http://www.tutespace.com/2016/03/angular-js.html
la source
Premier contrôleur
Deuxième contrôleur
la source
Je pense que le
meilleur moyen
est d'utiliser $ localStorage. (Fonctionne tout le temps)Votre cardController sera
Vous pouvez également ajouter
la source