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

20 просмотров

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

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
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
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта