0
votes

La valeur ComportorSubjecte est renvoyée lorsqu'il n'est pas nécessaire. Réinitialise parfois la valeur qui est réellement nécessaire

J'ai un bouton, qui est configuré pour mettre à jour les paramètres d'un composant. Cela fonctionne lorsque je touche le bouton, qui met à jour les paramètres. Parfois, lorsque je rafraîchit la page ou je vais naviguer à une URL à une URL à partir d'une page externe, la logique de mise à jour ne fonctionne pas.

Je sais que c'est parce que le comportement est codé dur à (2019,1,1, "magasins") comme indiqué ci-dessous. Pourquoi l'auteur a-t-il mis que je ne suis pas sûr. Tout ce que je sais, c'est que l'objet avec (2019,1,1, 'stockes') n'est pas nécessaire sur rafraîchir. J'ai une méthode getlgcurrentweek () ci-dessous ci-dessous, c'est-à-dire censé mettre à jour le (2019,1,1, "magasins") à l'année en cours, trimestre et semaine. Qui est maintenant 2020, 1,4.

Pourquoi cette valeur codée dur montrait-elle quand j'essaie de le réinitialiser? Ou mieux encore, quel serait le meilleur moyen d'obtenir les valeurs correctes à partir de la demande HTTP getlgCurrentweek () afin que je puisse utiliser ces valeurs dans la méthode getlgdata (paramètres) ? xxx

voici mon nconinit () xxx

bouton pour mettre à jour xxx

en conclusion. Comment utiliser this.slgservice.getslgcurrentweek () Pour mettre les paramètres à mettre dans this.slgservice.getslgdata (paramètres) sans influence de (2019,1,1 , "Magasins") du comportement?

Merci pour votre aide.


3 commentaires

Merci pour toutes les réponses et commentaires. Je lisons avec diligence toutes ces choses pour corriger mon code. Je vous en informerai quand vous avez lu tous ceux-ci. Merci et sera de retour bientôt. Merci encore!


Merci pour votre participation. Changé mon comportement à SlgParamssource privé: ReplaySubject = Nouveau ReplaySubject (NULL); Et maintenant sa ne pas être réinitialisé. J'ai essayé de faire la même chose avec ComportorSubject avec Null Value mais n'a pas fonctionné. Avez-vous une connaissance de savoir pourquoi cela a fonctionné? Je lis beaucoup la différence entre ReplaySubject et ComportorSubject mais c'est étrange que quelque chose qui retourne plusieurs appels aurait réparerait le problème. Je suis confus pourquoi ça marche maintenant. J'ai demandé aux autres en dessous. Quelqu'un a mis la lumière sur ce mystère?


Y a-t-il également une raison pour que ReplaySubject = nouveau ReplaySubject (NULL) fonctionnerait en mode de débogage et non à la production? Je viens de recevoir une erreur après la publication et avons dû revenir en arrière.


3 Réponses :


1
votes

Pourquoi cette valeur codée dur est-elle montrée lorsque j'essaie de le réinitialiser? P>

Cela se produit parce que vous utilisez NOREFERRER"> comportementalSubject code> . Cette valeur initiale que vous fournissez au constructeur fort> est ce que vous obtenez initialement lorsque vous faites p> xxx pré>

Qu'est-ce qui est intéressant à propos de ce type de sujet est qu'il sera cache strong> la valeur émise forte>. En conséquence, de nouveaux abonnés recevront cette valeur. P>

Voici comment je pense que vous pouvez sauter cette première valeur émise, en utilisant le Ignorer code> Opérateur . P>

this.slgService.slgParams
 .pipe(skip(1))
 .subscribe(data => {
   this.slgParams = data;
   this.getData(this.slgParams);
})


1 commentaires

Merci pour votre participation. Changé mon comportement à SlgParamssource privé: ReplaySubject = Nouveau ReplaySubject (NULL); Et maintenant sa ne pas être réinitialisé. J'ai essayé de faire la même chose avec ComportorSubject avec Null Value mais n'a pas fonctionné. Avez-vous une connaissance de savoir pourquoi cela a fonctionné? Je lis beaucoup la différence entre ReplaySubject et ComportorSubject mais c'est étrange que quelque chose qui retourne plusieurs appels aurait réparerait le problème. Je suis confus pourquoi ça marche maintenant. Pourriez-vous éclairer cela? J'ai demandé aux autres la même chose.



1
votes

Ce sont des pièces de code très intéressantes. Si j'étais à votre place, j'essaierais de faire quelque chose comme l'extrait suivant. Si vous pouvez reproduire le problème dans Stackblitz ou Entrez la description du lien ici , je peux vous fournir un exemple complet.

ngOnInit() {
  this.slgForm = new FormGroup({
    year: new FormControl(),
    quarter: new FormControl(),
    week: new FormControl(),
    dept: new FormControl()
  })

  this.slgService.getSLGCurrentWeek().pipe(
    map(data => {
      this.slgForm.patchValue({
        year: data.year,
        week: data.week,
        quarter: data.quarter
      })
      // Those are your slg params, that you will get as value from the stream
      return new SLGReportParams(data.year, data.quarter, data.week, this.slgForm.value.dept)
    }),
    switchMap(slgParams => {
      // This will return new stream, with the response of the get data http request
      return this.slgService.getSLGData(slgParams);
    })
  ).subscribe(resp => {
    // Here you will have access to the data recieved from the getData function
    console.log(resp)
  })
}


1 commentaires

Merci pour votre participation. Changé mon comportement à SlgParamssource privé: ReplaySubject = Nouveau ReplaySubject (NULL); Et maintenant sa ne pas être réinitialisé. J'ai essayé de faire la même chose avec ComportorSubject avec Null Value mais n'a pas fonctionné. Avez-vous une connaissance de savoir pourquoi cela a fonctionné? Je lis beaucoup la différence entre ReplaySubject et ComportorSubject mais c'est étrange que quelque chose qui retourne plusieurs appels aurait réparerait le problème. Je suis confus pourquoi ça marche maintenant.



1
votes

Si je peux suggérer une petite piste pour votre problème ici => Vous devez vraiment faire attention à vos abonnements: N'oubliez pas de "désabonner" tous en mettant en œuvre NGDestroy. Chaque fois que vous chargez votre composant, il vous abonnera encore et encore.

Si vous voulez avoir une idée: allez à votre console et vérifiez la mémoire utilisée, ou au moins des journaux de contrôle, vous devez le voir aller sur le toit après un certain temps.

J'espère que cela vous a aidé un peu.


1 commentaires

Merci pour votre participation. Changé mon comportement à SlgParamssource privé: ReplaySubject = Nouveau ReplaySubject (NULL); Et maintenant sa ne pas être réinitialisé. J'ai essayé de faire la même chose avec ComportorSubject avec Null Value mais n'a pas fonctionné. Avez-vous une connaissance de savoir pourquoi cela a fonctionné? Je lis beaucoup la différence entre ReplaySubject et ComportorSubject mais c'est étrange que quelque chose qui retourne plusieurs appels aurait réparerait le problème. Je suis confus pourquoi ça marche maintenant.