angular2 pass ngModel to a child component

前端 未结 3 1410
再見小時候
再見小時候 2020-12-10 12:47

I have ParentComponent and a ChildComponent, and I need to pass the ngModel in ParentComponent to ChildComponent.

// the below is in ParentComponent template         


        
相关标签:
3条回答
  • 2020-12-10 13:18

    You need to implement ControlValueAccessor in the child class. It's what defines your component as "having a value" that can be bound to using the angular way.

    Read more about it here: http://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html

    0 讨论(0)
  • 2020-12-10 13:30

    For Parent -> Child, use @Input

    For Child -> Parent, use @Output

    So to use both:

    In the Parent Component

    Typescript:

      onValueInParentComponentChanged(value: string) {
        this.valueInParentComponent = value;
      }
    

    Html

    <child-component 
     (onValueInParentComponentChanged)="onValueInParentComponentChanged($event)"
     [valueInParentComponent]="valueInParentComponent">
    </child-component>
    

    In the Child Component

    Typescript:

    export class ChildComponent {  
       @Input() valueInParentComponent: string;
       @Output() onValueInParentComponentChanged = new EventEmitter<boolean>();
    } 
    
    onChange(){
      this.onValueInParentComponentChanged.emit(this.valueInParentComponent);
    }
    

    Html

    <input type="text" [(ngModel)]="valueInParentComponent"   
        (ngModelChange)="onChange($event)"/>
    

    Full Example

    https://plnkr.co/edit/mc3Jqo3SDDaTueNBSkJN?p=preview

    Other ways to accomplish this:

    https://angular.io/docs/ts/latest/cookbook/component-communication.html

    0 讨论(0)
  • 2020-12-10 13:33

    It sounds like you are trying to wrap a form control. I wrote a library that helps you do that! s-ng-utils has a superclass to use for your parent component: WrappedFormControlSuperclass. You can use it like this:

    @Component({
      template: `
        <!-- anything fancy you want in your parent template -->
        <child-component [formControl]="formControl"></child-component>
      `,
      providers: [provideValueAccessor(ParentComponent)],
    })
    class ParentComponent extends WrappedFormControlSuperclass<ValueType> {
      // This looks unnecessary, but is required for Angular to provide `Injector`
      constructor(injector: Injector) {
        super(injector);
      }
    }
    

    This assumes that <child-component> has a ControlValueAccessor, as @Amit's answer suggests. If you are writing <child-component> yourself, there is also a superclass in s-ng-utils to help with that: FormControlSuperclass.

    0 讨论(0)
提交回复
热议问题