2017-07-11 2 views
3

Alle meine Ereignisemitter funktionieren bis auf eine ordnungsgemäß.Angular 4 - Aufruf einer übergeordneten Methode von einer untergeordneten Komponente funktioniert nicht

child.ts:

@Component({ 
    ... 
    outputs: ['fileUploaded'] 
    }) 

export class childComponent implements OnInit { 
    ... 
    fileUploaded = new EventEmitter<boolean>(); 
    ... 
    randomMethod(){ 
    ... 
    this.fileUploaded.emit(true); 
    } 

} 

randomMethod() wird von der übergeordneten Komponente genannt, wie ich in parent.ts zeigen würde. Es wird nicht in child.html aufgerufen.

Parent.html

... 
<child (fileUploaded)="onSubmit($event)"></child> 
.. 

parent.ts

export class parentComponent { 
    ... 
    theChild = new childComponent; 
    submitted = false; 
    ... 
    onSubmit(event: boolean) { 
    console.log('in onSubmit()'); 
    this.submitted = event; 
    } 

    functionCallsChild(){ 
    this.theChild.randomMethod(); 
    ... 
    this.theChild = new childComponent; 
    } 
} 

Meine App meldet sich nie "in onSubmit()" warum also nicht aufgerufen diese Methode wird? Ich habe auch versucht, kein neues Kind-Objekt in meiner letzten Zeile zu erstellen, aber das hat keinen Unterschied gemacht.

+0

versuchen, @Output Dekorateur zu verwenden, siehe mehr: http://learnangular2.com/outputs/ –

Antwort

-1

Ihre Auswahl der untergeordneten Komponente falsch ist, sollten Sie ViewChild wie diese verwendet werden:

Eltern.html:

<child #theChild (fileUploaded)="onSubmit($event)"></child> 

parent.ts:

export class parentComponent { 
    ... 
    @ViewChild('theChild') theChild; 
    submitted = false; 
    ... 
    onSubmit(event: boolean) { 
    console.log('in onSubmit()'); 
    this.submitted = event; 
    } 

    functionCallsChild(){ 
    this.theChild.randomMethod(); 
    ... 
    } 
} 
0

Versuchen Sie es so:

@Output() 
    fileUploaded = new EventEmitter<boolean>(); 

Und entfernen:

outputs: ['fileUploaded'] 

prüfen Dokumentation here! : D

+0

Danke, leider kein Glück. Es muss etwas damit zu tun haben, dass ich das Kindobjekt in der Elternkomponente erstelle und dann etwas zurück zum Elternteil erwarte, der es angerufen hat? Vielleicht kein Ereignis in Kind HTML ausgeben? Das sind die einzigen Unterschiede zwischen diesen und meinen anderen Event-Emittern. – Hiding

+0

@Hiding Kannst du die Child-Komponente nicht mit einem Selektor statt "theChild = new childComponent;" verwenden? – SrAxi

0

Sie sollten keine untergeordnete Komponente erstellen, verwenden Sie einen neuen Operator.

Sie sollten @ViewChild() verwenden, um untergeordnete Komponente zu referenzieren.

4

Vielleicht habe ich nicht klar, warum Sie diesen Ansatz wählen oder wofür Sie ihn brauchen, aber soweit ich weiß, sollten Sie die EventEmitter vom Kind bis zu seinem Elternteil verwenden. Das bedeutet, dass das Ereignis, das .emit() ausgelöst wird, in der child.html platziert werden soll. Versuchen Sie, wie dies tun, und es sollte funktionieren:

child.html

<div (click-or-whatever-fires-what-you-want)="randomMethod()"></div> 

child.ts:

@Component({ 
    ... 
    }) 

export class childComponent implements OnInit { 
    ... 
    @Output() fileUploaded = new EventEmitter<boolean>(); 
    ... 
    randomMethod(){ 
    ... 
    this.fileUploaded.emit(true); 
    } 

} 

Parent.html

... 
<child (fileUploaded)="onSubmit($event)"></child> 
.. 

parent.ts

export class parentComponent { 
    ... 
    submitted = false; 
    ... 
    onSubmit(event: boolean) { 
    console.log('in onSubmit()'); 
    this.submitted = event; 
    } 
} 

Hoffe, dass es hilfreich war.

+0

Aufruf von randomMethod() von child.html macht keinen Sinn mit meiner Anwendung. Es muss in randomMethod() gefeuert werden, das auch von der übergeordneten Komponente – Hiding

+0

aufgerufen werden muss Ok, das war das _ "Ich habe nicht klar, warum Sie diesen Ansatz wählen" _ Teil. ;) Mmh ... Ich weiß nicht, es sieht so aus als ob du versuchst: eine Kind-Methode vom Elternteil abzufeuern, dann macht die Methode im Kind etwas und löst die Ausstrahlung aus. Das übergeordnete Element fängt das untergeordnete Ereignis-emittiert ab und löst sein Ereignis selbst aus. Ist es richtig? Wenn ja, ist es nicht besser, stattdessen einen Dienst einzurichten? – kamakatekki

+0

Dank +1 war es eine große Hilfe – Eldho

0

Sie können die Methode der übergeordneten Komponente aus der untergeordneten Komponente aufrufen, indem Sie den @Output Emitter verwendet, die auf untergeordnete Komponente auf jeden Fall ausgelöst. Ich habe diesen Ansatz im Kommentarbereich verwendet, um die Anzahl in der Elternkomponente mit der Methode der Kindkomponente zu aktualisieren.

Parent.ts

/** Update the count from child component */ 
UpdateCount(id) { 
this.getTotalCommentCountByGroupId(id); 
} 

Parent.html

<srv-group-feed [LiveFeedInput]="groupPostRes" 
(CommentCount)="UpdateCount($event)"></srv-group-feed> 

Child.ts

this.CommentCount.emit(data you need to pass); 

und global können Sie @Output Ereignis in der Kinderkomponente dh child.ts erklären

@Output() CommentCount = new EventEmitter<string>(); 
Verwandte Themen