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?

PascalVKooten
quelle

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 ...

Thierry Templier
quelle
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)"
Shabbir Dhangot
quelle
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()
}
Francesco Borzi
quelle
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.

Günter Zöchbauer
quelle
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