Рассмотрим следующий компонент:
@Component({
selector: 'app-test'
template: 'Hello!'
}}
export class TestComponent {
@Output() readonly selectionChange = new EventEmitter<SomeTypeHere>();
}
С звонком:
<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>
Обратите внимание, что я написал selectedChange
вместо правильного выходного имени selectionChange
. Angular 9 с strictTemplates
включенным флагом мне совсем не помог. Это молча провалилось. Интересно то, что если я делаю то же самое @Input
, приложение ловит ошибки и не компилируется.
Есть ли способ выдать ошибку, если я попытаюсь «прослушать» несуществующее @Output
?
angular
angular-directive
angular9
dev_054
источник
источник
@Output()
в общей библиотеке или даже в приложении и забывает удалять вызовы ... и, поскольку у нас нет ошибок компиляции, как у нас@Input()
, мы не можем точно найти, что вызывает определенные проблемы (или даже для того, чтобы не хранить мусор в коде). Модульные тесты могут быть полезны? Возможно, но пока невозможно из-за времени.Ответы:
Не выдается никакой ошибки, поскольку привязка событий в Angular используется не только с
@Output
s иEventEmitter
s, но и для прослушивания событий DOM, таких какclick
,keyup
и т. Д. Его можно даже использовать для прослушивания пользовательских событий . Например, если вы создаете и отправляете пользовательское событие в дочернем компоненте:Затем в родительском компоненте вы можете поймать его по имени:
Angular использует target.addEventListener (type, listener [, options]); внутренне (вы можете убедиться в этом, посмотрев ссылки ниже), где
type
может быть любая строка.Вот почему он не выдает никаких исключений, если не находит подходящих
@Output
s.listenToElementOutputs
DefaultDomRenderer2.listen
EventManager.addEventListener
DomEventsPlugin.addEventListener
источник
@Input()
(помните , что входы имеют одинаковые характеристики: может быть что - то глобальное , какdisabled
,id
и т.д.) угловые кинула ошибки? Почему это работает@Input
, а не для@Output
? Кроме того, я пытаюсь найти способ предупредить / выбросить ошибку, если пропущено несуществующее@Output
.addEventListener
(я добавлю несколько ссылок на мой ответ, чтобы показать его). Я думаю, это было сделано намеренно, поэтому разработчики могли использовать привязку событий со своими собственными событиями. Я считаю, что нет способа отключить это поведение во время компиляции. Хотя некоторые IDE (например, IntelliJ Idea) могут выделять такие места и отображать предупреждения.[attr.any-attribute]
, в этом случае ошибка не будет выброшен либо.Прямого решения вашей проблемы не существует, однако некоторые случаи могут быть рассмотрены.
click
событие , то вы можете сделать его частью селектора естьselector: 'app-test[selectionChange]'
. Также вы можете сделать это, например:selector: 'app-test[selectionChange]', app-test[click]'
значениеclick
илиselectionChange
требуется.selectionChange
вselectedChange
то вы можете использовать этот селектор:selector: 'app-test:not([selectionChange])'
пользователь силы для обновления.источник
Если вы используете VS Code, вы можете установить это расширение: Angular Language Service выдаст предупреждение, если метод или свойство не определены. Это расширение работает с обоими выходами и входами (и attrs, и т. Д.).
источник
@Output
Angular Language Service ни в чем не помогает. Дайте мне знать, если вам нужно, чтобы я уточнил вопрос.@Output
вы увидите то же сообщение об ошибке.