我想将输入值传递给父组件。目前,我正在从我的子组件发送整个输入ElementRef
。这样做有一种优雅的方式吗?我的意思是,我只需要发送一个号码,而不是整个参考号。
子组件:
import { Component, ViewChild } from '@angular/core';
@Component({
selector: 'app-action-dialog-content',
template: `
<md-input-container>
<input #amount md-input placeholder="Amount">
<span md-suffix>€</span>
</md-input-container>
`
})
export class ActionDialogContentComponent {
@ViewChild('amount') amount;
}
父组件:
import { Component, ViewChild } from '@angular/core';
import { ActionDialogContentComponent } from './../action-dialog-content/action-dialog-content.component';
@Component({
selector: 'app-action-dialog',
template: `
<app-action-dialog-content></app-action-dialog-content>
<md-dialog-actions>
<button md-raised-button (click)="sendData()">ADD</button>
</md-dialog-actions>
`
})
export class ActionDialogComponent {
@ViewChild(ActionDialogContentComponent) amountInput: ActionDialogContentComponent;
sendData() {
console.log(this.amountInput.amount.nativeElement.value);
}
}
答案 0 :(得分:3)
您可以使用来自angular / core的EventEmitter和Output将子组件中的数据发送到父组件,然后父组件可以通过事件绑定来处理。请参阅Angular 2指南中的child to parent component interaction。
从你的例子:
子:
export class ActionDialogContentComponent {
amount: number;
@Output() amountChanged: new EventEmitter<number>();
changeAmount() { //Trigger this call from the child component's template
this.amountChanged.emit(this.amount);
}
}
父级(请注意,您绑定的html事件与子组件中的@Output属性匹配):
@Component({
selector: 'app-action-dialog',
template: `
<app-action-dialog-component (amountChanged)="onAmountChanged($event)"></app-action-dialog-component>
<md-dialog-actions>
<button md-raised-button (click)="sendData()">ADD</button>
</md-dialog-actions>
`
})
export class ActionDialogComponent {
onAmountChanged(amount: number) {
// do what you want with new value
}
}
答案 1 :(得分:0)
您可以使用EventEmitter来执行此代码来自共享链接,因此可以轻松引用,请查看此link以获取更多详细信息
子组件代码
import { Component, EventEmitter, Input, Output } from '@angular/core';
@Component({
selector: 'my-voter',
template: `
<h4>{{name}}</h4>
<button (click)="vote(true)" [disabled]="voted">Agree</button>
<button (click)="vote(false)" [disabled]="voted">Disagree</button>
`
})
export class VoterComponent {
@Input() name: string;
@Output() onVoted = new EventEmitter<boolean>();
voted = false;
vote(agreed: boolean) {
this.onVoted.emit(agreed);
this.voted = true;
}
}
父组件代码
import { Component } from '@angular/core';
@Component({
selector: 'vote-taker',
template: `
<h2>Should mankind colonize the Universe?</h2>
<h3>Agree: {{agreed}}, Disagree: {{disagreed}}</h3>
<my-voter *ngFor="let voter of voters"
[name]="voter"
(onVoted)="onVoted($event)">
</my-voter>
`
})
export class VoteTakerComponent {
agreed = 0;
disagreed = 0;
voters = ['Mr. IQ', 'Ms. Universe', 'Bombasto'];
onVoted(agreed: boolean) {
agreed ? this.agreed++ : this.disagreed++;
}
}