2017-01-13 38 views
5

Bir girdinin değerini ana bileşene aktarmak istiyorum. Şu anda tüm girdinin ElementRef çocuk bileşenimden gönderiyorum. Bunu yapmanın zarif bir yolu var mı? Demek istediğim, bir referans değil, sadece bir numara göndermem gerekiyor.Bir ana bileşene giriş değeri nasıl aktarılır

Çocuk Bileşen:

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; 

} 

Ana Bileşen:

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); 

    } 

} 
+1

kontrol Daha fazla ayrıntı için 'EventEmitter' kullanabileceğiniz bu https://angular.io/docs/ts/latest/cookbook /component-communication.html#!#child-to-parent – rashfmnb

cevap

3

için ebeveyn çocuk bileşeni veri yayan açısal/çekirdekten EventEmitter ve çıkış kullanmak hangi Üst bileşen, olay bağlama yoluyla işleyebilir. Angular 2 kılavuzlarında child to parent component interaction'a bakın. sizin örnekten

:

Çocuk:

@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 
    } 
} 
+0

Merhaba @ironmanwaring, cevabınız için teşekkürler. Bir eklenti düğmesine sahip olduğumdan, parent component içindeki 'changeAmount()' işlevini tetiklemenin mümkün olup olmadığını sormak istiyorum. Çocuk bileşeninde sadece bir girdi listesi var. – Gabriel

+0

Anladığımdan emin olmak için - ana bileşenden miktar değerini değiştirmek ve daha sonra alt bileşende yeni değer ekranını mı görmek istiyorsunuz? – ironmanwaring

+0

Hayır, üst bileşen üzerindeki düğmeye bastığımda ve ardından değeri bir diziye bastığımda, alt bileşenin değerini almak istiyorum. – Gabriel

0

:

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); 
    } 
} 

Veli (not html olay maçlara çocuk bileşeninden Çıkışta özelliği bağlayıcı olduğunu) EventEmitter'u kullanarak bu kodun paylaşımlı linkten yapılabilmesi için kolayca bağlantı kurabilirsiniz. Daha fazla ayrıntı için lütfen link numaralı telefonu kontrol edin.

Çocuk Bileşen Kod

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; 
    } 
} 

Veli Bileşen Kod

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++; 
    } 
}