2014-12-02 6 views
1

Я создал кнопкуAngularJS закрытия DIV, который показывает на нг нажмите

<button type="button" ng-click="chooseOptions()" id="chooseOptionButton" ng-bind="whatToDisplay()"></button> 

который показывает <div ng-show=appearOnChoice> по щелчку и переключает обратно при нажатии еще раз!

$scope.chooseOptions=function(){ 
    $scope.appearOnChoice=!$scope.appearOnChoice; 

    } 

Однако, я также хочу этот элемент, чтобы скрыть еще раз, когда пользователь щелкает где-нибудь за пределами этого div элемента. Как я могу это сделать? Мне нужно строго придерживаться AngularJS и не использовать jQuery.

Надеюсь, вы можете мне помочь в этом.

EDIT: Я пытался адаптировать некоторые из событий начальной загрузки DatePicker, но я не уверен, как применять его правильно

$scope.$on('datepicker.focus', focusElement); 
scope.$watch('isOpen', function(value) { 
     if (value) { 
      scope.$broadcast('datepicker.focus'); 
      scope.position = appendToBody ? $position.offset(element) : $position.position(element); 
      scope.position.top = scope.position.top + element.prop('offsetHeight'); 

      $document.bind('click', documentClickBind); 
     } else { 
      $document.unbind('click', documentClickBind); 
     } 
     }); 
    var focusElement = function() { 
    $timeout(function() { 
     self.element[0].focus(); 
    }, 0 , false); 
    }; 

Как я могу адаптировать это к моему делу ?!

ответ

0

Я просто решил это, используя выпадающее меню ui bootstrap. Это происходит вместе с опцией is-open и закрывается при нажатии снаружи.

0

Если у DIV есть фокус, вы можете использовать директиву ng-blur на DIV для запуска set presentOnChoice в false. Однако, если DIV еще не имеет фокуса (что не будет, если вы в зависимости от кнопки, чтобы сделать его видимым), вам нужно будет манипулировать DOM в коде (для обеспечения фокуса) ИЛИ создать пользовательскую директиву установите фокус так, чтобы директива ng-blur работала. Ознакомьтесь с возможностями для этого с this link.

В качестве альтернативы вы можете добавить директиву ng-click для каждого объекта, который будет отображаться на вашем экране, который скроет DIV при запуске. Но я не думаю, что это лучший способ ...

+0

Я приближаюсь к вашему решению. Разумеется, размытие - отличная идея. Но я должен упомянуть, что как только div будет виден, и я нажимаю на него, кнопка теряет фокус, и в то же время div тоже не получает фокуса. Поэтому, похоже, это невозможно. – Dribel

+0

Я думаю, что это одна из основных проблем. Было бы неплохо просто установить фокус на div через DOM. Я не уверен, что вы можете установить фокус на div, щелкнув, поскольку он не является элементом ввода. EDIT: добавление tabindex в div может помочь.Проверьте [эта ссылка] (http://stackoverflow.com/a/148444/2719246) – Beartums

+0

Талиндекс не работает, к сожалению. В любом случае спасибо!!!! – Dribel

0

Я думаю, что вам не нужно писать функцию, вы можете использовать ng-init для создания модели, ng-show, чтобы показать/скрыть div на основе значения модели, а с помощью ng-click измените значение модели. Смотрите пример ниже:

var myapp = angular.module('myapp',[]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="myapp"> 
 
<div ng-init="showDiv = true;" > 
 
    <div ng-show="showDiv"> SHOOOOOOOOW </div> 
 
    <button ng-click="showDiv = !showDiv;">Click me</button> 
 
</div> 
 
</div>

Вы можете установить значение модели, чтобы быть ложным, когда пользователь щелкает везде, и установите его еще раз верно, когда речь нажимает кнопку. Если вы сделали скрипку, я могу помочь вам легче :)

+0

Правда, но опять же, как вы устанавливаете его в false при нажатии везде, если вы не добавите директиву 'ng-click =" showDiv = false "' на каждый элемент, который находится в клике, который не является div? – Beartums

+0

Но как я могу определить «везде еще»? – Dribel

+0

Событие Размножение с соответствующими командами stopPropagation должно быть в состоянии сделать это с помощью ng-click на внешнем div, но я думаю, что я где-то читал, что угловой манипулятор не обрабатывал надлежащим образом stopPropagation. Однако не удалось найти ссылку. EDIT: мое утверждение неверно. stopPropagation можно обрабатывать через $ event. Проверьте этот ответ [http://stackoverflow.com/questions/20300866/angularjs-ng-click-stoppropagation](http://stackoverflow.com/questions/20300866/angularjs-ng-click-stoppropagation) – Beartums

0

Самый простой и чистый способ обработки щелчка - это зарегистрировать и событие на документе, которое удалит элемент, если что-либо кроме него или его детей, щелкнул.

Для примера сервиса, который делает это увидеть GitHub EnzeyNet/Services

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

var divElem 
nzService.registerClickAwayAction(function() { 
    divElem.remove(); 
}, divElem);