Angular2: Parent and Child Components Communication

后端 未结 2 1778
既然无缘
既然无缘 2020-12-21 03:46

I\'m trying to create a parent and child component where the child component is going to have a states drop down. Can someone help me understand how I can access the states

相关标签:
2条回答
  • 2020-12-21 04:03

    Using output and emit you can easily access child data in parent component. For example

    import { Component,Input,Output,EventEmitter  } from '@angular/core';
    
    @Component({
      selector: 'child-component',
      template: '<div>'
          +'<span>Child Component: </span>'
          +'<span>{{name}}</span>'
          +'<button (click)="shareData()">Share data to parent</button>'
        +'</div>',
      styleUrls: ['./app.component.css']
    })
    export class ChildComponent {
    
     @Input() name: string;
     @Output() shareDataToParent = new EventEmitter();
    
     title : string;
     constructor(){
         this.title = 'Sharing from child to parent';
     }
    
     shareData(){
         this.shareDataToParent.emit(this.title);
     }
    }
    
    <child-component name="Angular" (shareDataToParent) = shareDataToParent($event)>
    </child-component>
    

    Parent component

    shareDataToParent(sharedText:string){
      console.log(sharedText);
    }
    

    More info on child parent communication

    0 讨论(0)
  • 2020-12-21 04:06

    I would define an output into your State component and triggers an event using it:

    @Component({
      selector: 'state',
      providers: [FormBuilder],
      templateUrl: 'app/state.html',
      directives: []
    })
    export class State {
      statesDropDownValues = ['NJ', 'NY', 'PA', 'CA'];
      stateForm: ControlGroup;
      @Output()
      stateChange:EventEmitter<string> = new EventEmitter(); // <----
    
      constructor(fb: FormBuilder) {
        this.stateForm = fb.group({
          'state': ''
        });
      }
    
      setStateValue() {
        alert('State Selected: ' + this.stateForm.value.state);
        stateChange.emit(this.stateForm.value.state);
      }
    }
    

    The parent component can register on this event to be notified of changes:

    <div>
      <h2>Registration Form</h2>
      <form [ngFormModel]=registrationForm (ngSubmit)="onSubmit()">
        <label>Name: </label>
        <input type="text" ngControl="name">
        <state (stateChange)="handleNewState($event)"></state>
        <button [disabled]="!registrationForm.valid">Submit</button>
      </form>
    </div>
    

    $event contains the value of the new state value.

    Edit

    Here is a way to save the selected state in the parent component:

    export class App {
      registrationForm: ControlGroup;
    
      state: string;
    
      constructor(fb: FormBuilder) {
        this.registrationForm = fb.group({
          'name': ['', Validators.required],
          'email': ''
        });
      }
    
      handleNewState(state) {
        this.state = state;
      }
    
      onSubmit() {
        alert('Entered Name: ' + this.registrationForm.value.name);
        alert('State Selected: ' + this.state);
      }
    }
    
    0 讨论(0)
提交回复
热议问题