问题
I have ParentComponent and a ChildComponent, and I need to pass the ngModel in ParentComponent to ChildComponent.
// the below is in ParentComponent template
<child-component [(ngModel)]="valueInParentComponent"></child-component>
how can I get the value of ngModel in ChildComponent and manipulate it?
回答1:
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
回答2:
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
回答3:
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.
来源:https://stackoverflow.com/questions/41350584/angular2-pass-ngmodel-to-a-child-component