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 ответов

22 просмотра

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

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(); }

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта