Considérez le composant suivant:
@Component({
selector: 'app-test'
template: 'Hello!'
}}
export class TestComponent {
@Output() readonly selectionChange = new EventEmitter<SomeTypeHere>();
}
Avec l'appel:
<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>
Notez que j'ai écrit à la selectedChange
place du nom de sortie correct selectionChange
. L'angulaire 9 avec le drapeau strictTemplates
activé ne m'a pas du tout aidé. Il a échoué en silence. La partie intéressante est que si je fais la même chose pour @Input
, l'application détecte les erreurs et ne compile pas.
Existe-t-il un moyen de lancer une erreur si j'essaie «d'écouter» un fichier inexistant @Output
?
angular
angular-directive
angular9
dev_054
la source
la source
@Output()
dans une bibliothèque partagée, ou même sur l'application et oublie de supprimer les appels ... et comme nous n'avons pas d'erreurs de compilation, comme nous l'avons fait pour@Input()
, nous ne pouvons pas trouver exactement ce qui cause certains problèmes (ou même pour ne pas garder les ordures dans le code). Des tests unitaires pourraient être utiles? Peut-être, mais à l'époque ce n'est pas encore possible à cause du temps.Réponses:
Il n'y a pas d' erreur lancée parce que l' événement de liaison dans angulaire est utilisé non seulement avec
@Output
s etEventEmitter
s, mais aussi d'écouter les événements DOM tels queclick
,keyup
, etc. Il pourrait même être utilisé pour écouter les événements personnalisés . Par exemple, si vous créez et émettez un événement personnalisé dans le composant enfant:Ensuite, dans le composant parent, vous pouvez l'attraper par son nom:
Angular utilise target.addEventListener (type, écouteur [, options]); en interne (vous pouvez vous en assurer en consultant les liens ci-dessous), où
type
pourrait être n'importe quelle chaîne.C'est pourquoi il ne lève aucune exception s'il ne trouve pas de
@Output
s correspondant .listenToElementOutputs
DefaultDomRenderer2.listen
EventManager.addEventListener
DomEventsPlugin.addEventListener
la source
@Input()
(rappelez - vous que les entrées ont les mêmes caractéristiques: peut être quelque chose comme globaldisabled
,id
etc.) angulaire erreurs jeté? Pourquoi ça marche@Input
, mais pas pour@Output
? En outre, j'essaie de trouver un moyen d'avertir / de lancer une erreur si une inexistante@Output
est passée.addEventListener
(je vais ajouter quelques liens à ma réponse pour le montrer). Je pense que cela a été fait intentionnellement, afin que les développeurs puissent utiliser la liaison d'événements avec leurs propres événements personnalisés. Je crois qu'il n'y a aucun moyen de désactiver ce comportement au moment de la compilation. Bien que certains IDE (comme IntelliJ Idea) puissent mettre en évidence de tels endroits et afficher des avertissements.[attr.any-attribute]
, dans ce cas, aucune erreur ne sera générée non plus.Il n'y a pas de solution directe à votre problème, mais certains cas peuvent être couverts.
click
événement de bouton , vous pouvez l'intégrer au sélecteur, c'est-à-direselector: 'app-test[selectionChange]'
. Vous pouvez également le faire par exemple:selector: 'app-test[selectionChange]', app-test[click]'
signifiantclick
ouselectionChange
est requis.selectionChange
à - d.,selectedChange
Vous pouvez utiliser ce sélecteur:selector: 'app-test:not([selectionChange])'
pour forcer les utilisateurs à mettre à jour.la source
Si vous utilisez VS Code, vous pouvez installer cette extension: Angular Language Service émet un avertissement lorsqu'une méthode ou une propriété n'est pas définie. Cette extension fonctionne à la fois avec les sorties et les entrées (et attrs, etc ...).
la source
@Output
, Angular Language Service n'aide en rien. Faites-moi savoir si vous avez besoin de moi pour clarifier la question.@Output
vous verrez le même message d'erreur.