Примечание: похожий вопрос здесь , но на него, похоже, не дан ясный ответ, который я могу применить.
Проблема: у меня есть 'go to top' кнопка, функция которой состоит в том, чтобы прокрутить пользователя вверх страницы. Он не должен быть видимым, когда пользователь фактически находится наверху.
Его видимость в настоящее время обрабатывается с помощью анимированного атрибута непрозрачности, но с ним можно взаимодействовать благодаря отображению: ни один из них не применяется. Поэтому я должен найти способ отображения: ни один не применяется при непрозрачности 0.
Первая реализация, в Angular, должна сделать что-то вроде этого:
@HostListener('window:scroll', ['$event'])
scrolled(_event: Event) {
if (window.pageYOffset === 0) {
setTimeout(() => (this.noClick = true), 1000);
} else {
this.noClick = false;
}
this.show = window.pageYOffset > 0;
}
Где noClick
и show
являются логическими значениями, а noClick
применяется к классу, который устанавливает отображение: нет, а show
применяется к анимированной непрозрачности.
Однако существует условие гонки, где пользователь может прокрутить вниз после прокрутки до 0, и задержка все еще может установить noClick
в значение true.
Я хотел бы рассмотреть Observable для решения этой проблемы.
Если у меня есть два предмета :
displayNone = new Subject<boolean>(); // only contains true values
displaySome = new Subject<boolean>(); // only contains false values
и некоторый код события:
@HostListener('window:scroll', ['$event'])
scrolled(_event: Event) {
if (window.pageYOffset === 0) {
this.displayNone.next(true);
} else {
this.displaySome.next(false);
}
this.show = window.pageYOffset > 0;
}
Мне нужно создать наблюдаемую для функциональности displayNone
, где, если displayNone
задерживается 1000 мс (время анимации) и в в это время displaySome
излучает, оно должно игнорировать displayNone
.
Самое близкое, на что я могу прийти сейчас, это что-то вроде этого:
race(this.displaySome, this.displayNone.pipe(delay(1000)))
Но я понимаю, что это займет только оцените его один раз и примите решение, через которое пройти. Мне нужно, чтобы его постоянно оценивали.