0
votes

Communication angulaire entre composants non liés

J'ai deux composants non liés CartComponent et CheckoutComponent. J'aimerais transmettre des données de CartComponent à la caisseComponce. À cette fin, j'ai créé un service partagé.

 export class CheckoutComponent implements OnInit {

  checkoutProducts: Products[];
  constructor(private formBuilder: FormBuilder, private cartService: CartService) { }

  ngOnInit() {
    this.cartService.getData().subscribe( data => {
      this.checkoutProducts = data;
      console.log(this.checkoutProducts);
    });
  }
}


3 commentaires

Vous avez probablement deux instances de votre service (un avec les données et un vide). Mettre un console.log dans le constructeur de votre service et regardez combien de fois vous les invoquez


Comment fournit-vous votre service?


@ Aw3Same zapodaj.net/2869137968d0b.png.html


3 Réponses :


0
votes

Vous devez vous assurer que les deux composants utilisent la même instance du service. Où est fourni le service? Si les deux composants sont dans le même module, fournissez le service dans ce module. S'ils sont dans différents modules, fournissez uniquement le service dans un module qui importe les deux modules de composants. ( Appmodule est généralement un choix sûr.)

Aussi, avec plus de 6 versions de angulaires, vous pouvez définir les modules fournis directement au service. Retirez le service de tous les modules où il est fourni et essayez: xxx

ceci doit avoir le même résultat que pour fournir le service uniquement dans le Appmodule .


1 commentaires

Dans Appmodule j'ai ajouté ce service de service aux fournisseurs de tableau



0
votes

Je dois supposer que votre getCartProducts est un appel ASYNC - vous devez obtenir ou renvoyer une observable, vous avez donc besoin d'envoyer des valeurs dans la souscription

getCart() {
  this.cartService.getCartProducts().subscribe(res=>{
     this.cartProducts =res;
     this.cartService.setData(this.cartProducts);
  });
}


0 commentaires

1
votes

Ceci est parce que vous utilisez un sujet . Un nouveau abonné à un sujet ne recevra rien qui a été émis précédemment, sauf s'il s'agit d'un ReplaySubject ou un comportement (code> comportement . .

Je recommanderais d'utiliser replaysubject avec une longueur tampon de 1:

Cartsubjectlist privé = Nouveau ReplaySubject (1);

Lorsqu'un nouvel abonnement est effectué (via le CheckoutComponent ), il devrait immédiatement recevoir l'émission précédente.


0 commentaires