Перевірте, чи є вихід на компоненті


14

Розглянемо наступний компонент:

@Component({
  selector: 'app-test'
  template: 'Hello!'
}}
export class TestComponent {
  @Output() readonly selectionChange = new EventEmitter<SomeTypeHere>();
}

Зателефонувавши:

<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>

Зауважте, що я написав selectedChangeзамість правильної назви виводу selectionChange. Кутовий 9 із strictTemplatesвключеним прапором мені зовсім не допомагав. Це провалилось мовчки. Цікава частина полягає в тому, що якщо я роблю те саме @Input, програма додає помилки (і) і не компілюється.

Чи є спосіб помилитися, якщо я спробую "прослухати" неіснуюче @Output?


1
чи були помилки з попередніми версіями Angular? Я думаю, що це ніколи не кидало на це жодної помилки
Aravind

@Aravind ні, він ніколи не кидав помилок. Я запитую, чи це можливо. Заздалегідь спасибі.
dev_054

чому ти хочеш кинути помилку? чи є конкретна потреба? Я намагаюся зрозуміти ваше запитання
Aravind

@Aravind добре, я працюю над корпоративним додатком з багатьма розробниками, тому важливо мати якусь інформацію / попередження / помилку. Іноді хтось міняє / видаляє @Output()спільну конфігурацію або навіть у додатку і забуває видаляти виклики ... і оскільки у нас немає помилок компіляції, як у нас @Input(), ми не можемо знайти саме те, що викликає певні проблеми (або навіть за те, щоб не зберігати сміття в коді). Тести для одиниць можуть бути корисними? Можливо, але наразі це неможливо через час.
dev_054

Відповіді:


3

Там немає помилки викинута , тому що подія зв'язування в кутовому використовуються не тільки @Outputз і EventEmitterс, а й слухати DOM подія , такі як click, keyupі так далі Можна навіть використовувати для прослуховування користувальницьких подій . Наприклад, якщо ви створюєте та передаєте власну подію в дочірньому компоненті:

constructor (private el: ElementRef) {}
ngOnInit(): void {
    const domEvent = new CustomEvent('selectedChange', { custom: true });
    this.el.nativeElement.dispatchEvent(domEvent);
}

Тоді в батьківському компоненті ви можете зловити його за назвою:

<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>

Angular використовує target.addEventListener (тип, слухач [, параметри]); внутрішньо (ви можете переконатися в цьому, переглядаючи посилання нижче), де typeможе бути будь-який рядок.

Ось чому він не кидає жодного винятку, якщо не знаходить відповідних @Outputs.

listeToElementOutputs

DefaultDomRenderer2.listen

EventManager.addEventListener

DomEventsPlugin.addEventListener


Привіт @Kirill Simonov дякую за вашу відповідь! Добре, приймаючи ваше твердження: "Немає помилок, оскільки прив'язка подій у Angular використовується не тільки з @Outputs та EventEmitters, але і для прослуховування подій DOM, таких як клацання, клавіатура тощо", чому тоді, якщо ви переходите неіснуючі @Input()(пам'ятаєте , що входи мають однакові характеристики: може бути що - то глобальне , як disabled, idі т.д.) кутові кинула помилки? Чому це працює @Input, а не для @Output? Крім того, я намагаюся знайти спосіб попередити / викинути помилку, якщо @Outputпередається неіснуюче .
dev_054

@ dev_054 це тому, що набір властивостей обмежений існуючими властивостями елемента, директиви чи компонента DOM, тому Angular може легко перевірити, існує ця властивість чи ні. Події, з іншого боку, пов'язані з використанням addEventListener(я додаю кілька посилань до своєї відповіді, щоб показати це). Я думаю, це було зроблено навмисно, тому розробники могли використовувати прив'язку подій до власних подій. Я вважаю, що немає можливості відключити цю поведінку під час компіляції. Хоча деякі IDE (наприклад, IntelliJ Idea) можуть виділяти такі місця та відображати попередження.
Кирило Симонов

@ Dev_054 пам'ятайте , що ви також можете використовувати одностороннє зв'язування для HTML атрибутів з використанням [attr.any-attribute], в цьому випадку похибка не буде викинутий небудь.
Кирило Симонов

0

Немає прямого вирішення вашої проблеми, проте деякі випадки можуть бути охоплені.

  1. Якщо у вас є який-небудь вихід, який використовується в 100% місцях, таких як clickподія кнопки, то ви можете зробити його частиною селектора, тобто selector: 'app-test[selectionChange]'. Також ви можете зробити це, наприклад: selector: 'app-test[selectionChange]', app-test[click]'значення clickабо selectionChangeпотрібно.
  2. Якщо ви перепрофілюєте код і перейменовуєте вихід, тобто selectionChangeдля selectedChangeцього, ви можете використовувати цей селектор: selector: 'app-test:not([selectionChange])'змусити користувачів оновлюватись.

-4

Якщо ви використовуєте код VS, ви можете встановити це розширення: Angular Language Service видасть попередження, коли метод або властивість не визначені. Це розширення працює як з виходами, так і з входами (і attrs, і т.д. ...).

Ідентифікатор "XXXvalidateProvider" не визначений.


Ваш зразок показує @ Input. Бо @Outputслужба Angular Language не допомагає ні в чому. Повідомте мене, чи потрібен я для уточнення питання.
dev_054

Для того , @Outputви побачите те ж саме повідомлення про помилку.
srgrcp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.