Почему в примере с типом Angular (debounce) используется rxjs fromEvent, а не Renderer2.listen? - PullRequest
1 голос
/ 24 мая 2019

В руководстве Angular для Practical Observables приведен пример использования debounce в type-forward :

const typeahead = fromEvent(searchBox, 'input').pipe(
  map((e: KeyboardEvent) => e.target.value),
  filter(text => text.length > 2),
  debounceTime(10),
  distinctUntilChanged(),
  switchMap(() => ajax('/api/endpoint'))
);

Между тем, другая часть руководства рекомендует использовать Renderer2.listen() для взаимодействия DOM.Кроме того, в этом Medium post есть довольно решительный совет не манипулировать DOM напрямую.

Я читал эту связанную Q & A для событий «щелчка», которые могли быпримените к событиям «ввода».

Что меня огорчает, так это то, что я ищу последовательную философию дизайна в руководстве по Angular (и в нем есть много всего).Это кажется несовместимым.

Кроме того, два подхода не совсем одинаковы.

В случае Renderer2.listen() возвращается функция unlisten() для предотвращения утечек памяти.Не так с fromEvent.Я подозреваю, что fromEvent не протекает, но я не знаю и, что более важно, если это так, почему руководство рекомендует этот метод?

Наконец, я принимаю, что, может быть, нет абсолютно никакой разницымежду этими двумя методами.Конечно, тогда руководство будет смещено в сторону использования Renderer2 в этом случае.

В связи с этим я спрашиваю, что по поводу предложения типа вперед лучше, чем метод listen()?


Обновление

Я ценю ответы и комментарии, и вместе они прояснили некоторые вещи для меня.По сути, кодирование в мире моделей событий обременяет разработчика множеством сложностей.Кажется, что rxjs является ответом на этот мир, более простым / чистым способом потреблять события.Я также ценю Ответ, который по существу говорит: «RTFM», поэтому я пошел и сделал это тоже.

Если бы я решил, что должен был использовать Renderer2.listen(), и все же я также хочу воспользоваться Observables 'Более простая модель программирования, мне пришлось бы преобразовать listen() вызов в Observable.Я считаю, что это выглядит так:

new Observable(obs => renderer.listen(el.nativeElement, 'input', e => obs.next(e)))

Что, в конце концов, я думаю, оператор fromEvent делает под прикрытием.

Казалось бы преимущество fromEventКод также состоит в том, что мне не нужно вставлять Renderer2 в мой компонент, мне нужно только найти ElementRef для целевого объекта DOM.Дело в том, что я могу иметь Observable в любом случае, один из которых намного проще описать и кодировать.

Ответы [ 2 ]

1 голос
/ 24 мая 2019

fromEvent является горячим Наблюдаемым, поэтому потенциально оно протекает. И он должен быть отписан как большинство Observables, для лучших практик.

Renderer2.listen(), похоже, предназначен для действий в случае возникновения события, тогда как fromEvent обеспечивает больший контроль над самим потоком. Вы можете изменить его поведение, как в вашем фрагменте, с помощью debounceTime, filter и т. Д.

То есть с fromEvent вы контролируете поток, в то время как с Renderer2.listen() вы делаете некоторые побочные эффекты и т.д.

1 голос
/ 24 мая 2019

Предложение прямо над кодом:

Написание этого в полном JavaScript может быть довольно сложным. С помощью наблюдаемых вы можете использовать простую серию операторов RxJS:

Это означает, что это просто RxJS, без участия Angular. Это просто, чтобы объяснить основы RxJS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...