angle2-Aufruffunktion der übergeordneten Komponente


82

Ich habe eine App, in der ich eine Upload-Komponente habe, in die ich eine Datei hochladen kann. Es ist eingebettet in die body.component.

Beim Hochladen sollte eine Funktion (z. B. BodyComponent.thefunction()) der übergeordneten Komponente verwendet werden (Aufruf zum Aktualisieren der Daten): jedoch nur, wenn es sich bei der übergeordneten Komponente speziell um die handelt body.component. Der Upload kann auch an anderer Stelle mit unterschiedlichem Verhalten verwendet werden.

So etwas wie parent(this).thefunction(), wie geht das?

Antworten:


144

Ich würde ein benutzerdefiniertes Ereignis in der untergeordneten Komponente erstellen. Sowas in der Art:

@Component({
  selector: 'child-comp',
  (...)
})
export class ChildComponent {
  @Output()
  uploaded = new EventEmitter<string>();

  uploadComplete() {
    this.uploaded.emit('complete');
  }

Ihre übergeordnete Komponente könnte sich bei diesem Ereignis registrieren

@Component({
  template `
    <child-comp (uploaded)="someMethod($event)"></child-comp>
  `,
  directives: [ ChildComponent ]
})
export class ParentComponent {
  (...)

  someMethod(event) {
  }
}

Ein anderer Weg wäre, die übergeordnete Komponente in die untergeordnete Komponente zu injizieren, aber sie werden stark miteinander verbunden sein ...


Irgendeine Idee, warum ich einen undefinierten Ausgabefehler habe? Es ist an der Spitze in Typoskript definiert durch die Einfuhr angular2/core. Konsolenprotokoll zeigt ein Problem mit Angular2-Polyfills
PascalVKooten

Oh, meine Antwort enthält einen Tippfehler: @Ouputstatt @Output. Es könnte das Problem sein ... Ich habe meine Antwort aktualisiert.
Thierry Templier

Heh, habe es nicht bemerkt. Das war's.
PascalVKooten

Jetzt bekomme uploadComplete is not definedich einen Hinweis, dass ich diese nur als Beispiele kopiert habe. Das übergeordnete Element hat ebenfalls "someMethod", hat jedoch bereits ein Problem mit uploadComplete. Die übergeordnete Komponente verwendet die (hochgeladene) Bindung auf dem untergeordneten Knoten und hatte das untergeordnete Element bereits als Direktive.
PascalVKooten

3
Direktiven und Pipes in @Component sind vom Winkel RC6 veraltet.
Alex351

45

Unten wird für mich spätestens gearbeitet

Angular5

class ChildComponent {
  @Output() myEvent = new EventEmitter<string>();

  callParent() {
    this.myEvent.emit('eventDesc');
  }
}

In ParentTemplateder Vorlage

<child-component (myEvent)="anyParentMehtod($event)"

3
Dies ist eine gute Lösung, da sie einfach ist und der Elternteil entscheidet, welche Methode aufgerufen werden soll. Ich mag :-)
Jette

1
Was ist, wenn ich Router-Outlet verwende? Kann ich (myEvent) noch verwenden?
Robert Williams

Es ist für die untergeordnete Komponente, die in der übergeordneten Komponente verwendet wird. Nicht sicher über Router-Steckdose. Vielleicht hilft Ihnen diese Frage. stackoverflow.com/questions/45949476/…
Shabbir Dhangot

29

Lösung ohne Ereignisse.

Angenommen, ich habe ein ChildComponentund von diesem möchte ich die Methode aufrufen, myMethod()die dazu gehörtParentComponent (wobei der Kontext des ursprünglichen Elternteils beibehalten wird).

Übergeordnete Komponentenklasse:

@Component({ ... })
export class ParentComponent {

    get myMethodFunc() {
        return this.myMethod.bind(this);
    }

    myMethod() {
         ...
    }
}

Übergeordnete Vorlage:

<app-child [myMethod]="myMethodFunc"></app-child>

Untergeordnete Vorlage

@Component({ ... })
export class ChildComponent {

    @Input() myMethod: Function;

    // here I can use this.myMethod() and it will call ParentComponent's myMethod()
}

1
Ich habe versucht, dies zu verwenden, aber es funktioniert bei mir nicht. In meiner Version von myMethod verweist es auf ein Tabset in der übergeordneten Komponente (ich versuche, die Tabs von einem untergeordneten Element des übergeordneten Elements zu wechseln). Wenn ich im übergeordneten Dokument darauf verweise, funktioniert alles. Vom Kind kommt es in myMethod, ändert aber nicht die Registerkarte. Ich frage mich also, ob das Tabset, auf das es verweist, eine Kopie des echten ist, wenn das Kind darauf zugreift. Ich bin mir nicht sicher, was hier passiert, wenn this.myMethod.bind(this)es zurückgegeben wird. (Möglicherweise mache ich stattdessen etwas grundlegend Falsches.)
Katharine Osborne

Ich weiß, aber ich benutze nicht die 8. Version. Ich brauche dies für Ionic 3, das die 5-Version verwendet.
Vasilis Griechenland

@ VasilisGreece Ich bin nicht sicher, wie ich Ihnen helfen kann, aber ich empfehle Ihnen dringend, auf die neueste Ionic-Version (derzeit 4) zu aktualisieren
Francesco Borzi

23

Sie können die übergeordnete Komponente in die untergeordnete Komponente einfügen.

Weitere Informationen finden Sie unter
- Wie füge ich eine übergeordnete Komponente in eine untergeordnete Komponente ein?
- Die untergeordnete Komponente von Angular 2 bezieht sich auf die übergeordnete Komponente. Auf diese Weise können Sie sicherstellen, dass sie thefunction()nur aufgerufen wird, wenn die übergeordnete Komponente a ist body.component.

constructor(@Host() bodyComp: BodyComponent) {

Andernfalls wird die Verwendung @Output()bevorzugt, um vom Kind zum Elternteil zu kommunizieren.


1
Übrigens musste ich tun constructor(@Host() bodyComp: BodyComponent).. vielleicht wurde es vor kurzem geändert. Funktioniert super, danke!
Eddy Verbruggen

Vielen Dank, ich habe etwas durcheinander gebracht - behoben
Günter Zöchbauer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.