Я хотів би закрити спадне меню входу, коли користувач клацне де-небудь за межами цього випадаючого меню, і я хотів би зробити це за допомогою Angular2 та з "підходом" Angular2 ...
Я реалізував рішення, але справді не відчуваю впевненості в ньому. Я думаю, що повинен бути найпростіший спосіб досягти того ж результату, тому якщо у вас є якісь ідеї ... давайте обговоримо :)!
Ось моя реалізація:
Спадаючий компонент:
Це компонент для мого спаду:
- Кожен раз, коли цей компонент встановлюється видимим (наприклад: коли користувач натискає кнопку, щоб відобразити його), він підписується на "глобальну" тему rxjs userMenu, що зберігається в SubjectsService .
- І кожного разу, коли це приховується, він підписується на цю тему.
- Кожне клацання в будь-якому місці в шаблоні цього компонента запускає метод onClick () , який просто зупиняє події, що перекидаються у верхній частині (та компонент програми)
Ось код
export class UserMenuComponent {
_isVisible: boolean = false;
_subscriptions: Subscription<any> = null;
constructor(public subjects: SubjectsService) {
}
onClick(event) {
event.stopPropagation();
}
set isVisible(v) {
if( v ){
setTimeout( () => {
this._subscriptions = this.subjects.userMenu.subscribe((e) => {
this.isVisible = false;
})
}, 0);
} else {
this._subscriptions.unsubscribe();
}
this._isVisible = v;
}
get isVisible() {
return this._isVisible;
}
}
Компонент програми:
З іншого боку, є компонент програми (який є батьківським компонентом випадаючого компонента):
- Цей компонент вловлює кожну подію клацання та випромінює в одному темі rxjs ( userMenu )
Ось код:
export class AppComponent {
constructor( public subjects: SubjectsService) {
document.addEventListener('click', () => this.onClick());
}
onClick( ) {
this.subjects.userMenu.next({});
}
}
Що мене турбує:
- Мені не дуже зручно з ідеєю створення глобального предмета, який би виступав як з'єднувач між цими компонентами.
- SetTimeout : Це необхідно , тому що тут це те , що станеться в іншому випадку , якщо користувач натискає на кнопку , яка показує меню, що випадає:
- Користувач натискає на кнопку (яка не є частиною випадаючого компонента), щоб показати спадне меню.
- Відображається спадне меню, і воно негайно підписується на тему userMenu .
- Пузир події клацання до компонента додатка і потрапляє
- Компонент додатка випускає подія на UserMenu суб'єкті
- Компонент, що випадає, зафіксує цю дію на userMenu та приховає спадне меню.
- Наприкінці спадне меню ніколи не відображається.
Цей встановлений тайм-аут затримує підписку до кінця поточної черги коду JavaScript, що вирішує проблему, але, на мою думку, дуже елегантно.
Якщо ви знаєте, чистіші, кращі, розумніші, швидші чи міцніші рішення, будь ласка, повідомте мене!