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 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 voici mon nconinit () p> bouton pour mettre à jour p> en conclusion. Comment utiliser Merci pour votre aide. p> p> (2019,1,1, 'stockes') code> n'est pas nécessaire sur rafraîchir. J'ai une méthode
getlgcurrentweek () code> ci-dessous ci-dessous, c'est-à-dire censé mettre à jour le
(2019,1,1, "magasins") code> à l'année en cours, trimestre et semaine. Qui est maintenant 2020, 1,4. P>
getlgCurrentweek () code> afin que je puisse utiliser ces valeurs dans la méthode
getlgdata (paramètres) code>? p>
this.slgservice.getslgcurrentweek () code> Pour mettre les paramètres à mettre dans
this.slgservice.getslgdata (paramètres) code> sans influence de (2019,1,1 , "Magasins") du comportement? P>
3 Réponses :
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 constructeurfort> 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); })
Merci pour votre participation. Changé mon comportement à SlgParamssource privé: ReplaySubject
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) }) }
Merci pour votre participation. Changé mon comportement à SlgParamssource privé: ReplaySubject
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. P>
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. P>
J'espère que cela vous a aidé un peu. P>
Merci pour votre participation. Changé mon comportement à SlgParamssource privé: ReplaySubject
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.