2gis / slot

JavaScript фреймворк, позволяющий быстро и просто создавать модульные изоморфные приложения.
http://2gis.github.io/slot
BSD 2-Clause "Simplified" License
86 stars 10 forks source link

Pass unbindEvents hook to module config #256

Closed dekhanov closed 8 years ago

dekhanov commented 8 years ago

https://jira.2gis.ru/browse/ONLINE-9483

Иногда возникает ситуация, когда нужно ручками подписаться на какие-то событие в DOM. Традиционно в слоте это делается в clinetInit(), а отписка происходит в dispose(); С dumb-модулями есть проблема. Возникла ситуация, когда нужно подписываться на события DOM ноды не всегда, а по условию, зависящему от стейта. Удобнее всего это делать в методе bind(), который срабатывает на каждый ре-рендер глупого модуля. Использовать dispose() для снятия подписки на событие в таком случае не получается, потому что он не вызывается, поэтому нужен хук в конфиге модуля, по которому можно чистить все подписки перед каждым обновлением глупого модуля.

Пример использования:

...
bind() {
   if (state.edit || state.showShare || state.showDeleteDialog) {
       document.addEventListener('click', onDocumentClick, true);
   }
},
unbind() {
   document.removeEventListener('click', onDocumentClick, true);
},
...
dekhanov commented 8 years ago

Вот еще пример: Модуль photoUploader навешивает обработчик события на drop и отписывается от него в методе dispose, но в глупом модуле часто происходят ре-рендеры, но не dispose, в итоге: image

RrredHead commented 8 years ago

:+1: Лишним не будет

ilyapro commented 8 years ago

:+1: