У меня есть директива всплывающей подсказки, которая должна открываться/закрываться при щелчке и дополнительно закрываться при произвольном щелчке. Поскольку angular-translate
не позволяет изменять содержимое самого элемента, вместо этого я добавляю элементы директивы.
Директива выглядит примерно так (учтите, что это упрощенная версия):
{
restrict: 'A',
scope: {},
compile: function(element)
{
element.after('<div class="toggle"></div>
<div class="message" ng-show="active"></div>');
},
link: function(scope, element)
{
angular.element(element.siblings('toggle')).click(function()
{
scope.$apply(function()
{
scope.active = !scope.active;
}
});
angular.element(document).click(function()
{
scope.$apply(function()
{
scope.active = false;
}
});
}
}
Проблема в том, что событие щелчка по элементу запускается (scope.active = true
), а затем распространяется на документ, в то время как он мгновенно закрывается.
Однако, если я останавливаю распространение, в большинстве случаев это работает нормально, единственный случай, когда это не так, - это когда у меня есть несколько экземпляров директивы на моей странице, и я нажимаю один за другим (первый открытый должен закрыться, а другой должен открыться но из-за остановки распространения событие document.click
другого экземпляра не срабатывает.
Редактировать: Эта скрипка демонстрирует проблему. Если вы щелкнете зеленое поле и щелкнете его еще раз, оно сработает, если вы щелкнете зеленое поле, а затем фон, он сработает, если вы щелкнете зеленое поле, а затем другое зеленое поле, однако оба открыты, хотя первое должно закрыться.
Если вы удалите event.stopPropagation()
на line 20
, подсказка вообще не будет отображаться, поскольку сначала срабатывает щелчок по окну, подсказка отображается, но после дальнейшего распространения события также срабатывает щелчок по фону и мгновенно снова закрывает его.
Если есть лучшее решение моей проблемы, я тоже буду признателен