169 похожих чатов

Всем привет, я не особо понимаю почему один код работает

а другой нет, и в чём концептуальная их разница.

Контекст: я хочу сделать атрибут который будет проверять валидность расширения выбранного файла, что бы расширение выбранного файла было как в accept. То есть если выбранный файл, отличается от того что мы кинули в accept - у нас блокируется обработка события и показывается модалка.
То есть у меня в html что-то такого:
<input fileUpload type="file" accept=".jpg,.jpeg,.png,.pdf,.doc,.docx" (change)="типметод($event)">
fileUpload - моя директива.

Я сделал что-то такого изначально, код внутри директивы:
@HostListener("change", ["$event"])
public onChange(event: any): void
{
event.preventDefault();
event.stopPropagation();
}
Но этот код не работает как нужно. То есть он ловит событие change у input, но он не останавливает обработку события change повешенное на input.

Я уже почти сдался и думал имплементить свой контрол для этой задачи как наткнулся на такой код, он в ngOnInit:
this.subscription = fromEvent(input.parentNode, 'change', {capture: true}).subscribe((event: Event) => {
if (event.target == input) {
event.preventDefault();
event.stopPropagation();
}
});
Самое крутое в этом коде то что он работает и решил моё задачу. Но я нихера не понимаю какое отличие моего варианта с этим. То есть я не понимаю почему мой вариант не работает, а этот вариант работает. Не подскажите с этим?

8 ответов

9 просмотров

потому что захват происходит раньше чем всплытие?

Vlad-Chabanenko Автор вопроса
Smooth Operator
потому что захват происходит раньше чем всплытие?

Не знал про такие понятие, спасибо. Прочитал об этом, хорошо, теперь я понимаю вроде бы что это в общих чертах. По сути в втором случае у нас событие изначально вызывается на родительском компоненте, так как мы через него подписались с capture true, и оставаливаем дальнейшее погружение, окей. Звучит для меня логично почему это работает в 2 случае. А почему первый не работает? То есть у нас директива сначала ловит событие, а потом обрабатывается уже повешенный change event (который на input). При этом если в директиве прекратить обработку то оно никак не повлияет на уже повешенный change event.

Vlad-Chabanenko Автор вопроса
Smooth Operator
есть еще одна фаза) может поэтому

Так ну я прочитал что 3 фразы, всплытие, перехват и текущая стадия. Если в 2 случае мы работаем с перехватом события с помощью родительского компонента и его прерываем, то в 1 случае мы ж работает в пределах одного инпута

Vlad Chabanenko
Так ну я прочитал что 3 фразы, всплытие, перехват ...

события происходят на одном елементе, там нет захвата и всплытия

Vlad-Chabanenko Автор вопроса
Smooth Operator
события происходят на одном елементе, там нет захв...

Тогда почему может быть такая ситуация что нельзя прервать выполнение в HostListener? У меня есть идея что из-за HostListener и change создаётся два события по сути, и из-за этого нельзя никак повлиять из одного события на другое. Но хром показывает для этого инпута всё таки один обработчик, ну или я не понимаю как проверить эту теорию с двумя событиями

Vlad Chabanenko
Тогда почему может быть такая ситуация что нельзя ...

> Тогда почему может быть такая ситуация что нельзя прервать выполнение в HostListener? как ты его прерываешь?

Vlad-Chabanenko Автор вопроса
Smooth Operator
> Тогда почему может быть такая ситуация что нельз...

@HostListener("change", ["$event"]) public onChange(event: any): void { event.preventDefault(); event.stopPropagation(); }

Похожие вопросы

Обсуждают сегодня

А чем вам питонисты не угодили?😂
.
79
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Ты просто гитлеровскую эстетику плохо понимаешь. Он же всё под Цезаря делал. А это как бы запрещённый приём в политике. Пиджаки они зачем все носят? Чтобы показать что они тип...
Ivan Kropotkin
4
а чем лучше всего сделать глобальный лок, если много нодов, до сотни? ну то есть мне надо, чтобы некоторые операции с объектом не происходили одновременно. перемещение между н...
Д. П.
15
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Hi guys, I'm looking for a good LLM course. Is there any course to learn LLMs in advanced? I'm aiming to use them in my apps, so a perfect course in my openion, is not only a ...
Taha
14
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Карта сайта