Comment passer un objet D'un composant à un autre en angle 2?

j'ai Angulaire des composants et le premier composant utilise le deuxième comme un directive . Ils devraient partager le même modèle objet , qui est initialisé dans le premier volet. Comment puis-je passer Ce modèle au second composant?

43
demandé sur Anoush Hakobyan 2015-12-04 15:15:20

4 réponses

Component 2, la directive component peut définir une propriété input ( @input annotation in Typescript). Et le Component 1 peut passer cette propriété au component directive de template.

de Voir cette SI réponse Comment faire la communication entre un maître et détail de la composante dans Angular2?

et comment l'entrée est transmise aux composants enfants. Dans votre cas, c'est la directive.

15
répondu Chandermani 2017-05-23 12:18:20

pour la liaison unidirectionnelle de données de parent à enfant, utiliser le décorateur @Input (comme recommandé par le guide de style) pour spécifier une propriété d'entrée sur le composant enfant

@Input() model: any;   // instead of any, specify your type

et utiliser un modèle de propriété de liaison dans le modèle parent

<child [model]="parentModel"></child>

puisque vous passez un objet (un type de référence JavaScript) toute modification que vous apporterez aux propriétés de l'objet dans le parent ou le composant enfant sera les deux composantes ayant une référence au même objet. Je le montre dans le Plunker .

si vous réassignez l'objet dans le composant parent

this.model = someNewModel;

Angular propagera la référence du nouvel objet vers le composant enfant (automatiquement, dans le cadre de la détection de changement).

la seule chose que vous ne devriez pas faire est de réassigner l'objet dans le composant enfant. Si si vous faites cela, le parent référencera toujours l'objet original. (Si vous avez besoin de données bidirectionnelles, voir https://stackoverflow.com/a/34616530/215945 ).

@Component({
  selector: 'child',
  template: `<h3>child</h3> 
    <div>{{model.prop1}}</div>
    <button (click)="updateModel()">update model</button>`
})
class Child {
  @Input() model: any;   // instead of any, specify your type
  updateModel() {
    this.model.prop1 += ' child';
  }
}

@Component({
  selector: 'my-app',
  directives: [Child],
  template: `
    <h3>Parent</h3>
    <div>{{parentModel.prop1}}</div>
    <button (click)="updateModel()">update model</button>
    <child [model]="parentModel"></child>`
})
export class AppComponent {
  parentModel = { prop1: '1st prop', prop2: '2nd prop' };
  constructor() {}
  updateModel() { this.parentModel.prop1 += ' parent'; }
}

Plunker - Angular RC.2

44
répondu Mark Rajcok 2017-05-23 12:10:34

vous pouvez également stocker vos données dans un service avec un setter et l'obtenir sur un getter

import { Injectable } from '@angular/core';

@Injectable()
export class StorageService {

    public scope: Array<any> | boolean = false;

    constructor() {
    }

    public getScope(): Array<any> | boolean {
        return this.scope;
    }

    public setScope(scope: any): void {
        this.scope = scope;
    }
}
9
répondu ueman 2017-04-05 07:18:15

utiliser l'annotation de sortie

@Directive({
  selector: 'interval-dir',
})
class IntervalDir {
  @Output() everySecond = new EventEmitter();
  @Output('everyFiveSeconds') five5Secs = new EventEmitter();
  constructor() {
    setInterval(() => this.everySecond.emit("event"), 1000);
    setInterval(() => this.five5Secs.emit("event"), 5000);
  }
}
@Component({
  selector: 'app',
  template: `
    <interval-dir (everySecond)="everySecond()" (everyFiveSeconds)="everyFiveSeconds()">
    </interval-dir>
  `,
  directives: [IntervalDir]
})
class App {
  everySecond() { console.log('second'); }
  everyFiveSeconds() { console.log('five seconds'); }
}
bootstrap(App);
2
répondu E. Fortes 2016-03-16 15:08:38