У меня есть директива подсказки, которая должна открываться/закрываться при щелчке и дополнительно закрываться при произвольном щелчке. Поскольку 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
событие другого экземпляра не срабатывают
Edit:.This fiddle демонстрирует проблему Если щелкнуть на зеленом поле и нажмите на него снова работает, если. вы щелкаете зеленой рамкой, а затем фон, в которой он работает, если вы нажмете зеленую рамку, а затем другую зеленую рамку, но оба открыты, хотя первая должна закрыться.
Если вы удаляете event.stopPropagation()
на line 20
, подсказка вообще не отображается, так как сначала щелкнуть по ящику, подсказка отображается, но после дальнейшего распространения события щелчок по фону также срабатывает и мгновенно закрывает его снова.
Если есть общее лучшее решение моей проблемы, я оценил бы, что хорошо
Можете ли вы привести пример jsfiddle, с помощью которого воспроизвести проблему? –
Уверенный, проверьте обновленный вопрос – Aides