3
votes

Comment accéder à la boucle for du composant parent dans un composant enfant qui a les entrées?

Je suis donc coincé là-dessus. J'essaie de faire parler le composant Parent ou de l'intégrer avec le composant enfant. Voici le composant parent qui a essentiellement la boucle for utilisée pour itérer ou générer plus de liens si un utilisateur veut en ajouter plus ou appuie sur le bouton pour en ajouter plus.

<div class="section url-wrap">
    <input aria-label="URL Title" placeholder="Title" type="text" [value]="urls[i].title" (ngModel)="urls[i].title" name="url.title.{{ i }}"
        (input)="updateTitle(i, $event.target.value)">

          <input aria-label="URL" placeholder="https://example.com" type="text" [value]="urls[i].url" (ngModel)="urls[i].url" name="url.url.{{ i }}"
          (input)="updateUrl(i, $event.target.value)">   
 </div>

Le composant parent ne devrait pouvoir enregistrer et afficher que la sortie du composant enfant.

Ceci est un exemple du composant enfant

<div class="section url-wrapper">
    <div *ngFor="let url of urls; let i = index;" class="link input-wrapper">
            <childComponent></childComponent>
      <button class="button bad icon-only" (click)="removeURL(i)">
        <i class="far fa-times"></i>
      </button>
    </div>
  </div>

J'ai besoin d'aide à la fois pour permettre au composant parent d'enregistrer l'entrée du composant enfant et pouvoir itérer de la boucle for du parent si cela est possible.

Veuillez me faire savoir si vous avez besoin de plus d'informations telles que les fichiers des composants ou des précisions


3 Réponses :


2
votes

Le moyen standard de laisser les composants se parler les uns les autres est avec entrée-sortie:

Vous pouvez passer des valeurs du parent aux enfants avec @Input par exemple:

Code parent: strong>

    <childComponent [someInputValue]="hello" (itemSelectedOutput)="someParentMethod($event)"></childComponent>

someParentMethod(event: any) {
 console.log(event);
}

Code enfants:

  @Output() itemSelectedOutput: EventEmitter<any> = new EventEmitter();

  buttonClicked() {
   this.itemSelectedOutput.emit("clicked");
  }

et vous pouvez passer des valeurs (après avoir été déclenché) des enfants au parent:

Code enfants:

@Input() someInputValue; //this property will be "hello"

Code parent:

<childComponent [someInputValue]="hello"></childComponent>

Vous pouvez atteindre la même chose avec ISubscription mais je vous suggère d'utiliser la méthode ci-dessus

J'espère que cela pourra vous aider


3 commentaires

Je comprends, en gros le [someInputValue] = "hello" imprimera ceci dans le composant parent et la même règle peut être appliquée si nous voulions enregistrer correctement l'entrée des utilisateurs?


@ B.Allen avec entrée vous transmettez une valeur appartenant au composant parent au composant enfants. Vous devez imaginer des composants tels que des boîtes où vous ne pouvez pas voir en dehors d’eux si ce n’est avec des paramètres d’entrée et de sortie qui sont des moyens de se lier. Quoi qu'il en soit, oui, vous pouvez transmettre tout ce que vous voulez, les objets aussi. Si vous avez trouvé ma réponse correcte, veuillez la cocher comme meilleure réponse :)


Merci je comprends que cela a du sens! Je vois maintenant comment le composant parent peut parler au composant enfant, en particulier avec l'entrée et la sortie.



3
votes

Le code et l'exemple ci-dessous montreront comment les données circulent depuis parent -> enfant -> parent en utilisant les directives @Input () et @Output () .

p> Exemple de travail ici

parent.component.ts

import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'app-child',
  template: `
  <div class="section url-wrap">
    <input aria-label="URL Title" placeholder="Title" type="text" [value]="url.title"
        (input)="handleUrlUpdate($event, 'title')"/>

    <input aria-label="URL" placeholder="https://example.com" type="text" [value]="url.url"
        (input)="handleUrlUpdate($event, 'url')"/>   
 </div>
  `,
})
export class ChildComponent implements OnInit {
  @Input() url; // passed in from parent via [url] property on <app-child>
  @Output() updateUrl = new EventEmitter();
  constructor() { }

  ngOnInit() {
    // this.url is now available for the life of the child component (assuming it was passed by the parent)
  }

  handleUrlUpdate($event, propToUpdate) {
    // overkill, but used to demonstrate a point
    this.updateUrl.emit({url: this.url, prop: propToUpdate, newValue: $event.target.value});
  }

}

child.component.ts

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-parent',
  template: `
    <div class="section url-wrapper">
      <div *ngFor="let url of urls" class="link input-wrapper">
        <app-child [url]="url" (updateUrl)="onUrlUpdate($event)"></app-child>
      </div>
    </div>
  `
})
export class ParentComponent implements OnInit {
  public urls = [
    {url: "https://example.com", title: "Example1"},
    {url: "https://example.com", title: "Example2"},
    {url: "https://example.com", title: "Example3"},
  ]
  constructor() { }

  ngOnInit() {

  }

  onUrlUpdate($event) {
    // completely overkill, but just used to demonstrate a point
    var url = this.urls.find(_url => {
      // we can see here that the $event.url is actually the same object as the urls[i] that was
      // passed to the child. We do not lose the reference when it is passed to the child or back
      // up to the parent. 
      return $event.url === _url
    });
    if (url) {
      url[$event.prop] = $event.newValue;
    }
    console.log(`Updated URL's "${$event.prop}" property with the value "${$event.newValue}"`);
  }

}


3 commentaires

Pour une raison quelconque, je n'ai pas pu accéder au lien avec l'exemple, mais votre solution a définitivement répondu à ma question et a du sens! Ma seule question est est-ce que le tableau des URL publiques est rempli avec la sortie attendue? ou avez-vous volontairement ajouté les données d'exemple?


@ B.Allen Le tableau des URL publiques est simplement rempli avec les données d'exemple. Vous pouvez remplir cette liste comme vous le souhaitez. Il poussera les URL vers le composant enfant et les rendra en conséquence. De plus, j'ai corrigé le lien ci-dessus, vous devriez donc avoir accès à l'exemple de travail maintenant


Merci beaucoup! Cela m'a certainement aidé à comprendre le fonctionnement de l'imbrication des composants et à mieux comprendre comment les composants fonctionnent en angulaire!



0
votes

Je ne le ferais pas de cette façon en particulier. Si les enfants doivent connaître les parents, alors votre architecture doit être ajustée


0 commentaires