Considere el siguiente componente:
@Component({
selector: 'app-test'
template: 'Hello!'
}}
export class TestComponent {
@Output() readonly selectionChange = new EventEmitter<SomeTypeHere>();
}
Con la llamada:
<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>
Tenga en cuenta que he escrito en selectedChange
lugar del nombre de salida correcto selectionChange
. Angular 9 con la bandera strictTemplates
habilitada no me ayudó en absoluto. Falló en silencio. La parte interesante es que si hago lo mismo @Input
, la aplicación detecta los errores y no se compila.
¿Hay alguna forma de arrojar un error si trato de "escuchar" un inexistente @Output
?
angular
angular-directive
angular9
dev_054
fuente
fuente
@Output()
en una biblioteca compartida, o incluso en la aplicación, y se olvida de eliminar las llamadas ... y como no tenemos errores de compilación, como lo hemos hecho@Input()
, no podemos encontrar exactamente qué causa ciertos problemas (o incluso por no guardar basura en el código). ¿Las pruebas unitarias pueden ser útiles? Tal vez, pero en ese momento aún no es posible debido al tiempo.Respuestas:
No hay error tirado porque el suceso de unión en angular se utiliza no sólo con
@Output
s yEventEmitter
s, sino también para escuchar a los eventos DOM tales comoclick
,keyup
, etc. Incluso se podría utilizar para escuchar eventos personalizados . Por ejemplo, si crea y emite un evento personalizado en el componente secundario:Luego, en el componente principal, puede atraparlo por su nombre:
Angular usa target.addEventListener (type, listener [, options]); internamente (puede asegurarse de que
type
vea los enlaces a continuación), donde podría haber cualquier cadena.Es por eso que no arroja ninguna excepción si no encuentra
@Output
s coincidentes .listenToElementOutputs
DefaultDomRenderer2.listen
EventManager.addEventListener
DomEventsPlugin.addEventListener
fuente
@Input()
(recordar que las entradas tienen las mismas características: puede ser algo global comodisabled
,id
, etc.) angular arrojó errores? ¿Por qué funciona@Input
, pero no para@Output
? Además, estoy tratando de encontrar una manera de advertir / lanzar un error si@Output
se pasa un inexistente .addEventListener
(agregaré algunos enlaces a mi respuesta para mostrarlo). Creo que se hizo intencionalmente, por lo que los desarrolladores podrían usar el enlace de eventos con sus propios eventos personalizados. Creo que no hay forma de deshabilitar este comportamiento en tiempo de compilación. Aunque algunos IDE (como IntelliJ Idea) pueden resaltar dichos lugares y mostrar advertencias.[attr.any-attribute]
, en este caso tampoco se generará ningún error.No hay una solución directa a su problema, sin embargo, algunos casos pueden estar cubiertos.
click
evento de botón , puede hacerla parte del selector, es decirselector: 'app-test[selectionChange]'
. También puede hacer esto, por ejemplo:selector: 'app-test[selectionChange]', app-test[click]'
significadoclick
oselectionChange
es obligatorio.selectionChange
aselectedChange
continuación, puede utilizar este selector:selector: 'app-test:not([selectionChange])'
para los usuarios de la fuerza para la actualización.fuente
Si está utilizando VS Code, puede instalar esta extensión: Angular Language Service lanzará una advertencia cuando no se defina un método o propiedad. Esta extensión funciona tanto con salidas como con entradas (y atributos, etc.).
fuente
@Output
, Angular Language Service no ayuda en nada. Avíseme si necesita que aclare la pregunta.@Output
verás el mismo mensaje de error.