Betrachten Sie die folgende Komponente:
@Component({
selector: 'app-test'
template: 'Hello!'
}}
export class TestComponent {
@Output() readonly selectionChange = new EventEmitter<SomeTypeHere>();
}
Mit dem Anruf:
<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>
Beachten Sie, dass ich selectedChange
anstelle des richtigen Ausgabenamens geschrieben habe selectionChange
. Winkel 9 mit strictTemplates
aktivierter Flagge hat mir überhaupt nicht geholfen. Es schlug lautlos fehl. Der interessante Teil ist, dass wenn ich das Gleiche für mache @Input
, die App die Fehler abfängt und nicht kompiliert.
Gibt es eine Möglichkeit, einen Fehler auszulösen, wenn ich versuche, einen nicht vorhandenen "anzuhören" @Output
?
angular
angular-directive
angular9
dev_054
quelle
quelle
@Output()
in einer freigegebenen Bibliothek oder sogar in der App und vergisst, die Anrufe zu entfernen ... und da wir keine Kompilierungsfehler haben, wie wir sie haben@Input()
, können wir nicht genau herausfinden, was bestimmte Probleme verursacht (oder sogar, um keinen Müll im Code zu behalten). Unit-Tests könnten hilfreich sein? Vielleicht, aber zur Zeit ist es aufgrund der Zeit noch nicht möglich.Antworten:
Es gibt keine geworfen Fehler , weil die Ereignisbindung in Angular verwendet wird , nicht nur mit
@Output
s undEventEmitter
s, sondern auch auf die hören DOM - Ereignisse wieclick
,keyup
usw. Es gibt sogar verwendet werden könnte , um zu hören , benutzerdefinierte Ereignisse . Wenn Sie beispielsweise ein benutzerdefiniertes Ereignis in der untergeordneten Komponente erstellen und ausgeben:Dann können Sie es in der übergeordneten Komponente anhand ihres Namens abfangen:
Angular verwendet target.addEventListener (Typ, Listener [, Optionen]); intern (Sie können sicherstellen, dass Sie sich die folgenden Links ansehen), wo
type
sich eine beliebige Zeichenfolge befinden könnte.Deshalb wird keine Ausnahme ausgelöst, wenn keine passenden
@Output
s gefunden werden.listenToElementOutputs
DefaultDomRenderer2.listen
EventManager.addEventListener
DomEventsPlugin.addEventListener
quelle
@Input()
(denken Sie daran , dass Eingänge die gleichen Merkmale aufweisen: kann etwas global wie seindisabled
,id
usw.) Winkelfehler warf? Warum funktioniert es für@Input
, aber nicht für@Output
? Außerdem versuche ich, einen Weg zu finden, um Fehler zu warnen / zu werfen, wenn ein nicht vorhandener Fehler übergeben@Output
wird.addEventListener
(ich werde meiner Antwort einige Links hinzufügen, um sie anzuzeigen). Ich denke, es wurde absichtlich gemacht, damit die Entwickler die Ereignisbindung mit ihren eigenen benutzerdefinierten Ereignissen verwenden können. Ich glaube, es gibt keine Möglichkeit, dieses Verhalten beim Kompilieren zu deaktivieren. Obwohl einige IDEs (wie IntelliJ Idea) solche Orte hervorheben und Warnungen anzeigen können.[attr.any-attribute]
können. In diesem Fall wird auch kein Fehler ausgegeben .Es gibt keine direkte Lösung für Ihr Problem, jedoch können einige Fälle abgedeckt werden.
click
wird, können Sie sie in den Selektor aufnehmen, dselector: 'app-test[selectionChange]'
. H. Sie können dies auch zum Beispiel tun:selector: 'app-test[selectionChange]', app-test[click]'
Bedeutungclick
oderselectionChange
erforderlich.selectionChange
inselectedChange
, können Sie diesen Selektor verwenden:selector: 'app-test:not([selectionChange])'
um Benutzer zum Aktualisieren zu zwingen.quelle
Wenn Sie VS-Code verwenden, können Sie diese Erweiterung installieren: Angular Language Service gibt eine Warnung aus, wenn eine Methode oder Eigenschaft nicht definiert ist. Diese Erweiterung funktioniert sowohl mit Ausgängen als auch mit Eingängen (und attrs usw.).
quelle
@Output
Angular Language Service hilft nichts. Lassen Sie mich wissen, wenn ich die Frage klären muss.@Output
wird die gleiche Fehlermeldung angezeigt.