0
votes

Comment passer des données d'un composant à un autre en angulaire?

Je travaille sur une application de quiz avec angulaire. J'ai besoin d'obtenir la valeur de Corarronanswerscount dans mes résultats Je reçois la valeur de 0 pour CorrorswersCount dans les résultatsComponce lorsque j'ai vraiment besoin de la valeur des réponses correctes totales à la fin du quiz, et d'obtenir une valeur de 1166 au cours de laquelle le quiz à la place de CorrorswersCount. Je pense que le code a l'air correct, juste la valeur que je me trompe est fausse. Je ne sais pas ce que je fais mal. Ceci est mon code:

dans mon quizservice: p> xxx pré>

dans mon composant di-quiz: p> xxx pré>

et Dans mes résultatsComponent: p>

    constructor(private quizService: QuizService) {}

    ngOnInit() {
      this.quizService.correctAnswersCountSubject.subscribe(data => {
        this.correctAnswersCount = data;
      });
    }


5 commentaires

Comment Données angulaires de passage d'un composant à un autre Utilisez des liaisons à 2 voies.


Pourquoi créez-vous l'observable? Vous devriez être capable de souscrire directement au comportement dans le composant et de vous débarrasser de l'observable.


Oui, j'ai enlevé l'observable, mais obtenue toujours une valeur de 0 pour le CorrectswersCount ...


Pouvez-vous ajouter la relation de vos composants ou même mieux un Stackblitz?


Stackblitz.com/edit/angular-9-Quz-app


3 Réponses :


2
votes

Je vais vous donner des conseils que mon aide.

  • Vous devez utiliser @IJejectable ({apporée: 'root'}) sur quizservice pour garantir une instance singleton de ce service sur l'ensemble de l'application.
  • au composant di-quiz, appelez this.sendcounttoquizService à l'intérieur du rappel de l'abonnement.
  • chez les résultatsComponce, init l'abonnement sur le crochet Oninit (peut-être utiliser le tuyau ASYNC pour afficher la valeur de comptage).

    EDIT:

    Je pense que vous êtes en quelque sorte créé des événements récursifs à DiquizComponant en vous abonnant et en envoyant de nouvelles valeurs au même sujet au même endroit. Comme CorrechanSwersCountSubject est un comportement dans le comportement, vous pouvez obtenir la valeur de CorrechanSwersCountSubject sans vous y souscrire à l'aide de getvalue méthode.

    Cette fois, j'ai créé une démo sur Stackblitz , espérons que cela aide.

    Édité à nouveau:

    J'ai débogué votre code et avec quelques modifications que j'ai résolues tous les problèmes et ils sont:

    • à QuizQuesttionComponent , ajoutez le décorator @outPut () sur la réponse EconMitter.
    • à dépendencyinjectionquizcomponent , sur la méthode suivante, celle-ci.Swer est définie comme NULL avant d'appeler la méthode CheckIfansweredCorrectement qui a besoin de la valeur de réponse.
    • à dépendencyinjectionquizcomponent , vous n'émendez pas la ceci.compte, je l'ai fait sur la méthode CheckifansweredCorrectement.
    • et la chose la plus importante, j'ai supprimé tous les fournisseurs dans les modules pour garantir des instances singleton des services.

      Démo ici: Stackblitz


9 commentaires

Merci. J'ai fait tous ces conseils, mais je reçois toujours 0 pour la finale CorrorswersCount et avoir une valeur de 1166 pour la valeur pendant le quiz.


Merci, j'utilise votre code mais je n'ai toujours pas capable de le faire fonctionner. S'il vous plaît pourriez-vous voir mon stackblitz: Stackblitz.com/edit/angular-9-Quz-app


Super merci! Une chose que j'ai remarquée, c'est qu'un utilisateur pourrait potentiellement répondre à la question deux fois (et augmenter le nombre deux fois) s'ils reviennent avec précédent. Y a-t-il un moyen de l'empêcher de se produire?


Bien sûr, le groupe Radio Matériel dispose d'un projet , vous pouvez lier un indicateur dessus.


J'ai ajouté désactivé = "vrai" au groupe Radio-Radio, mais qui désactive tout le groupe. Je ne sais pas comment le faire fonctionner.


Oui, il suffit d'ajouter un accessoire booléen déjà déjà utilisé au composant initialement aussi faux, puis une fois que une réponse a été sélectionnée, définissez l'anonanswered sur true. Et à l'interrupteur HTML désactivé = "true" sur [désactivé] = "déjà-et-déjà"


J'ai ajouté cela.disabled = true à la fin de la fonction Sélectionne, mais lorsque je passe à la question suivante, toutes les options sont désactivées.


Dois-je réinitialiser avec ceci.disabled = false à l'intérieur de Ngonchanges?


J'ai ajouté une case à cocher USB pour des questions avec plusieurs réponses et il semble que le réglage désactivé empêche le formulaire de fonctionner correctement. Également curieusement, la deuxième question (avec les cases à cocher) ne semble pas augmenter le score lorsqu'il est répondu correctement.



0
votes

Si vous souhaitez transmettre des données entre les composants, vous avez quelques options. Je ne vais pas assumer quoi que ce soit sur votre scénario et que ceux-ci fonctionnent, car en réalité beaucoup de fois lorsque nous sommes nouveaux, nous réalisons que nous devons légèrement ré-archiver nos composants afin de réaliser ce que nous voulons. Au lieu de cela, je partagerai les méthodes à votre disposition.

Reliure de données standard

Si vous essayez de transmettre des données d'un composant parent à un composant enfant, vous pouvez simplifier Louez les données lorsque vous ajoutez votre composant au composant parent.

parent.component.html xxx

enfant.component.ts < pré> xxx

émettant des données vers le haut

Si vous essayez de transmettre des données d'un composant enfant à un composant parent, vous pouvez émettre vos valeurs de Arbre de composant (aka bouillonnant l'arborescence du composant)

parent.componenent.html xxx

parent.component.ts xxx

enfant.commonent.ts xxx

maintenant, ceux-ci sont cuits dans des solutions qui sortent de la boîte avec angulaire. < p> Gestion de l'état, c'est-à-dire Redux, etc.

Je suggère fortement que vous exploriez des solutions de gestion de l'État tels que REDUX via NGRX si vous souhaitez avoir des pouvoirs de stockage et de transmission de données vraiment impressionnants.

ngrx est incroyable. C'est un peu intimidant pour certains d'abord, mais les avantages sont fous! Imaginez être dans le module x et avoir besoin de données de Module Y et aucun module n'est connecté par un composant? Eh bien, vous ne seriez pas capable de transmettre les données vers le haut et / ou vers le bas de l'arborescence des composants dans ce scénario, mais vous pouvez avec Redux.

espère que cela aide.


2 commentaires

Oui, j'apprends des rxjs maintenant et j'ai une exposition à NGRX et c'est la direction que je cherche à entrer. Pour le moment, je voudrais travailler sur l'application quiz et l'obtenir à un point où je suis prêt à convertir à ngrx.


@ Integral100x c'est génial. Je recommande définitivement ngrx. Nous l'utilisons fortement pour nos applications publiques et privées. Si ma réponse vous a aidé, veuillez la marquer aussi correcte afin qu'elle puisse aider les autres à l'avenir quand ils viennent sur cette page.



0
votes

Une solution simple utilisera un service comme magasin pour stocker des réponses correctes. Veuillez trouver ci-dessous la solution:

Dans votre service Déclarez une variable privée et écrire des getters et des configurateurs pour celui-ci en service, comme ci-dessous: P>

private correctAnswerCount:number;

//if you are calling this method for each correct answer
incrementCorrectAnswerCount(){
this.correctAnswerCount++;
}

//if you are calling this method once
setCorrectAnswerCount(value:number){
this.correctAnswerCount = value;
}

//you can fetch this method from any compononent so as the value of correctAnswerCount
getCorrectAnswerCount(){
return this.correctAnswerCount;
}


1 commentaires

Merci, mais je suis déjà allé de l'approche comportementale.