AngularJS verfügt über die & -Parameter, mit denen Sie einen Rückruf an eine Direktive übergeben können (z. B. AngularJS-Methode für Rückrufe . Ist es möglich, einen Rückruf als @Input
für eine Angular-Komponente zu übergeben (so etwas wie unten)? Wenn nicht, was wäre dem am nächsten? AngularJS macht?
@Component({
selector: 'suggestion-menu',
providers: [SuggestService],
template: `
<div (mousedown)="suggestionWasClicked(suggestion)">
</div>`,
changeDetection: ChangeDetectionStrategy.Default
})
export class SuggestionMenuComponent {
@Input() callback: Function;
suggestionWasClicked(clickedEntry: SomeModel): void {
this.callback(clickedEntry, this.query);
}
}
<suggestion-menu callback="insertSuggestion">
</suggestion-menu>
angularjs
angular
typescript
Michail Michailidis
quelle
quelle
@Input
vorgeschlagene Weg meine Code-Spagetti gemacht und ist nicht einfach zu pflegen.@Output
s sind eine viel natürlichere Art, das zu tun, was ich will. Infolgedessen änderte ich die akzeptierte AntwortAntworten:
Ich denke das ist eine schlechte Lösung. Wenn Sie eine Funktion an eine Komponente mit übergeben möchten
@Input()
, ist@Output()
Decorator genau das, wonach Sie suchen.quelle
@Output
undEventEmitter
. Hier ist die Angular-Dokumentation für @Output für Interessierte.AKTUALISIEREN
Diese Antwort wurde übermittelt, als Angular 2 noch in Alpha war und viele der Funktionen nicht verfügbar / nicht dokumentiert waren. Während das Folgende noch funktioniert, ist diese Methode jetzt völlig veraltet. Ich empfehle dringend die akzeptierte Antwort über die unten.
Ursprüngliche Antwort
Ja, in der Tat, aber Sie sollten sicherstellen, dass der Umfang korrekt ist. Dafür habe ich eine Eigenschaft verwendet, um sicherzustellen, dass dies
this
bedeutet, was ich möchte.quelle
Parent -> Child
ngOnInit
würde ich nur verwenden:this.theCallback = this.theCallback.bind(this)
und dann kannst dutheCallback
statt weitergebentheBoundCallback
.Eine Alternative zur Antwort von SnareChops.
Sie können .bind (this) in Ihrer Vorlage verwenden, um den gleichen Effekt zu erzielen. Es ist vielleicht nicht so sauber, aber es spart ein paar Zeilen. Ich bin derzeit auf Winkel 2.4.0
quelle
@Input
bewirkt erneut, dass der Code zu Spaghetti wird und die Verwendung@Output
zu einem natürlicheren / entwirrten Prozess führtIn einigen Fällen muss die Geschäftslogik möglicherweise von einer übergeordneten Komponente ausgeführt werden. Im folgenden Beispiel haben wir eine untergeordnete Komponente, die Tabellenzeilen abhängig von der von der übergeordneten Komponente bereitgestellten Logik rendert:
Also wollte ich hier zwei Dinge demonstrieren:
quelle
.bind(this)
[getRowColor]="getColor"
und nicht[getRowColor]="getColor()"
;-)Als Beispiel verwende ich ein modales Anmeldefenster, in dem das modale Fenster das übergeordnete Element, das Anmeldeformular das untergeordnete Fenster und die Anmeldeschaltfläche die Schließfunktion des modalen übergeordneten Elements aufruft.
Das übergeordnete Modal enthält die Funktion zum Schließen des Modals. Dieses übergeordnete Element übergibt die Funktion zum Schließen an die untergeordnete Anmeldekomponente.
Nachdem die untergeordnete Anmeldekomponente das Anmeldeformular gesendet hat, schließt sie das übergeordnete Modal mithilfe der Rückruffunktion des übergeordneten Elements
quelle
Eine Alternative zu der Antwort, die Max Fahl gab.
Sie können die Rückruffunktion als Pfeilfunktion in der übergeordneten Komponente definieren, damit Sie diese nicht binden müssen.
quelle
Übergabe der Methode mit Argument unter Verwendung von .bind in der Vorlage
quelle
Verwenden Sie das beobachtbare Muster. Sie können den Wert Observable (nicht Subject) in den Eingabeparameter einfügen und über die übergeordnete Komponente verwalten. Sie benötigen keine Rückruffunktion.
Siehe Beispiel: https://stackoverflow.com/a/49662611/4604351
quelle
Eine andere Alternative.
Das OP fragte nach einer Möglichkeit, einen Rückruf zu verwenden. In diesem Fall bezog er sich speziell auf eine Funktion, die ein Ereignis verarbeitet (in seinem Beispiel: ein Klickereignis), die wie die von @serginho akzeptierte Antwort behandelt werden soll: mit
@Output
undEventEmitter
.Es gibt jedoch einen Unterschied zwischen einem Rückruf und einem Ereignis: Mit einem Rückruf kann Ihre untergeordnete Komponente Feedback oder Informationen vom übergeordneten Element abrufen, ein Ereignis kann jedoch nur darüber informieren, dass etwas passiert ist, ohne dass ein Feedback erwartet wird.
Es gibt Anwendungsfälle, in denen eine Rückmeldung erforderlich ist, z. Holen Sie sich eine Farbe oder eine Liste von Elementen, die die Komponente verarbeiten muss. Sie können gebundene Funktionen verwenden, wie einige Antworten vorgeschlagen haben, oder Sie können Schnittstellen verwenden (das ist immer meine Präferenz).
Beispiel
Angenommen, Sie haben eine generische Komponente, die eine Liste von Elementen {id, name} verarbeitet, die Sie für alle Datenbanktabellen mit diesen Feldern verwenden möchten. Diese Komponente sollte:
Untergeordnete Komponente
Bei normaler Bindung benötigen wir 1
@Input()
und 3@Output()
Parameter (jedoch ohne Rückmeldung des Elternteils). Ex.<list-ctrl [items]="list" (itemClicked)="click($event)" (itemRemoved)="removeItem($event)" (loadNextPage)="load($event)" ...>
, aber für die Erstellung einer Schnittstelle benötigen wir nur eine@Input()
:Übergeordnete Komponente
Jetzt können wir die Listenkomponente im übergeordneten Element verwenden.
Beachten Sie, dass der
<list-ctrl>
Empfangthis
(übergeordnete Komponente) das Rückrufobjekt ist. Ein zusätzlicher Vorteil besteht darin, dass die übergeordnete Instanz nicht gesendet werden muss. Es kann sich um einen Dienst oder ein Objekt handeln, das die Schnittstelle implementiert, sofern Ihr Anwendungsfall dies zulässt.Das vollständige Beispiel finden Sie auf diesem Stackblitz .
quelle
Die aktuelle Antwort kann vereinfacht werden, um ...
quelle
.bind(this)
dann ist dasthis
Innere des Rückrufs,window
was je nach Anwendungsfall möglicherweise keine Rolle spielt. Wenn Sie jedoch überhaupt einenthis
Rückruf haben,.bind(this)
ist dies erforderlich. Wenn Sie dies nicht tun, ist diese vereinfachte Version der richtige Weg.this
innerhalb der Rückruffunktion verwenden werden. Es ist nur fehleranfällig.