2016-02-01 11 views
30

Ich habe eine Komponente, die als Suchleiste fungiert. Es kann API-Anfragen stellen und die Ergebnisse über eine @Output und EventEmitter dem Rest der App zur Verfügung stellen, aber ich möchte auch, dass eine Funktion in die andere Richtung geht. Die Suchleisten-Komponente behält einen Verlauf der Suchvorgänge bei und ich möchte der übergeordneten Komponente einen Weg bieten, den Verlauf zu löschen. Das Beste, was mir einfällt, ist, eine Methode in meiner Suchleiste von einer übergeordneten Komponente aus aufzurufen.Eine Funktion in einem Kind Angular2-Komponente aufrufen?

Das Beste, was ich mir ausgedacht habe (aber nicht richtig umsetzen konnte), ist zu versuchen, eine EventEmitter IN meine Suchleiste zu übergeben, und das Kind abonniert die Ereignisse der Eltern. Die @Input hat die Bindung zum Zeitpunkt des Konstruktors noch nicht abgeschlossen, daher wird es schwierig, dies tatsächlich zu tun.

Ich denke, ich könnte versuchen, die Geschichte in der Elternkomponente zu speichern, aber der Grund, warum die Suchleiste eine Komponente ist, ist, weil es an mehreren Orten erscheint und dies nicht mit Trennung von Bedenken passt, so scheint es am besten zu sein Behalten Sie den Verlauf in der Suchleisten-Komponente bei.

Wie kann eine übergeordnete Komponente eine Funktion für eine untergeordnete Komponente aufrufen?

+0

die Geschichte Suche Legen Sie in einem Service und Ihr Kind Komponente auf die Dienste binden kann 'history' -Instanz var. Der Dienst kann klarstellen, dass der Elternteil anrufen kann. Nur eine Idee. Habe es noch nicht ausprobiert. –

+0

eine nette Lektüre - http://learnangular2.com/viewChild/ –

Antwort

30

Es stellt sich heraus, ich kann eine lokale Variable auf die Komponente setzen und haben Zugriff auf ihre öffentlichen Funktionen. Beispiel:

<search-bar #SearchBar ...></search-bar> 
<button (click)='SearchBar.ClearHistory()' ...></button> 

Anscheinend bindet die lokale Variable an die Komponente und nicht an das DOM, wie ich ursprünglich dachte. Ich stelle mir vor, dass ich Zugang zu allen öffentlichen Feldern und Funktionen habe.

+1

Dies ist buchstäblich das beste Ding überhaupt. Schön. – Dave

+0

nicht nur das, Sie können auch SearchBar als Parameter an einen Funktionsaufruf übergeben, und Sie können es verwenden, wenn als "any" zu deklarieren, ohne die hässliche chaotisch ungeschickt ViewChild verwenden;) – Ayyash

+0

Sie können auch das Click-Ereignis in die übergeordnete Komponente. Wenn Sie ViewChild ('SearchBar') = SearchBar verwenden, können Sie diese.SearchBar.ClearHistory() auf dem ViewChild verwenden, um die childs-Methode auszuführen! – ant45de

34

Sie benötigen die @ViewChild Dekorateur zu nutzen, die untergeordnete Komponente von der Mutter eine durch Injektion zu verweisen:

import { Component, ViewChild } from 'angular2/core'; 

(...) 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <h1>My First Angular 2 App</h1> 
    <child></child> 
    <button (click)="submit()">Submit</button> 
    `, 
    directives:[App] 
}) 
export class AppComponent { 
    @ViewChild(SearchBar) searchBar:SearchBar; 

    (...) 

    someOtherMethod() { 
    this.searchBar.someMethod(); 
    } 
} 

Hier die aktualisierte plunkr ist: http://plnkr.co/edit/mrVK2j3hJQ04n8vlXLXt?p=preview.

können Sie feststellen, dass der @Query Parameter Dekorateur auch verwendet werden könnten:

export class AppComponent { 
    constructor(@Query(SearchBar) children:QueryList<SearchBar>) { 
    this.childcmp = children.first(); 
    } 

    (...) 
} 

Hoffe, dass es Ihnen hilft, Thierry

+1

Ich mag diesen Ansatz. Der zusätzliche Vorteil gegenüber meiner Lösung besteht darin, dass ich in meiner Codedatei nicht auf die SearchBar zugreifen kann, sondern nur auf meinen Vorlagencode (der schnell unordentlich wird). –

+0

Das ist großartig, da ich die Methode automatisch aufrufen möchte, die auf einem anderen untergeordneten Komponentenereignis basiert, so dass die Art der Vorlage nicht zu mir passt. Wenn ich jedoch 2 SearchBar-Komponenten auf dieser Seite hatte, gibt es eine Möglichkeit, anzugeben, von welcher Methode die Methode someMethod aufgerufen werden soll. – James

Verwandte Themen