Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Скрытие меню при нажатии в любом другом месте экрана (https://javascript.ru/forum/angular/42077-skrytie-menyu-pri-nazhatii-v-lyubom-drugom-meste-ehkrana.html)

Shitbox2 11.10.2013 12:55

Скрытие меню при нажатии в любом другом месте экрана
 
Пробую сделать в Ангуляре меню, которое будет скрываться при щелчке в любом месте экрана кроме самого меню. От модального окна оно отличается тем, что там нет подложки на весь экран по которой можно щелкнуть, а от дропдауна — тем, что не закрывается при нажатии на самом себе. Работающий пример (меню с премиями): http://tamtakoe.ru/directors/index3.html

Пробовал несколько способов. Наиболее вменяемый: директива
.directive('oiBlurClose', ['$document', function ($document) {
    return {
      link: function(scope, element, attrs) {
        
        scope.$watch(attrs.oiBlurClose, function (value, oldval) {
          if (value !== oldval && value) {

            setTimeout(function () {
              $document.bind('click', function (e) {
                scope.$apply(function () {
                  scope[attrs.oiBlurClose] = false;
                })
              })
            }, 0);

          } else {
            $document.unbind('click')
          }
        }, true)

        element.bind('click', function (event) {
          event.preventDefault();
          event.stopPropagation();
        });
      }
    };
  }])

Самый большой недостаток тут это unbind('click'), который снимает все обработчики по клику, в т.ч. чужие. Неймспейсы Ангуляр не поддерживает. Второй вариант — сделать директиву с глобальным сервисом, где постоянно будет биндится $document и на каждое срабатывание будет по-очереди вызываться код из всех директив oiBlurClose. Как бы вы сделали?

ksa 11.10.2013 13:47

Цитата:

Сообщение от Shitbox2
Самый большой недостаток тут это unbind('click'), который снимает все обработчики по клику, в т.ч. чужие.

А ты почитай доку про тот unbind...
http://jquery-docs.ru/Events/unbind/#typefn
А потом сделай без этого "недостатка"... ;)

nerv_ 11.10.2013 14:30

Цитата:

Сообщение от ksa
А потом сделай без этого "недостатка"...

Цитата:

Сообщение от Shitbox2
Неймспейсы Ангуляр не поддерживает.


Цитата:

Сообщение от Shitbox2
value !== oldval

http://angular.ru/api/angular.equals

Цитата:

Сообщение от Shitbox2
setTimeout

http://angular.ru/api/ng.$timeout

Цитата:

Сообщение от Shitbox2
$document.unbind('click')

$document.unbind('click', handler);

ksa 11.10.2013 14:32

Цитата:

Сообщение от nerv_
$document.unbind('click', handler);

На это я и намекал автору... :yes:


Часовой пояс GMT +3, время: 03:31.