Я знаю, что есть много вопросов, которые задают подобную вещь. Но никто не решает мою проблему.
Я пытаюсь создать директиву, которая будет выполнять выражение при щелчке мыши за текущим элементом.
Зачем мне нужна эта функция? Я создаю приложение, в этом приложении есть 3 раскрывающегося меню, 5 выпадающих списков (как выбрано). Все это директивы angular. Предположим, что все эти директивы различны. Итак, у нас есть 8 директив. И все они нуждаются в одной и той же функции: при щелчке по элементу нужно скрыть раскрывающееся меню.
У меня есть 2 решения для этого, но у обоих возникла проблема:
Решение A:
app.directive('clickAnywhereButHere', function($document){
return {
restrict: 'A',
link: function(scope, elem, attr, ctrl) {
elem.bind('click', function(e) {
// this part keeps it from firing the click on the document.
e.stopPropagation();
});
$document.bind('click', function() {
// magic here.
scope.$apply(attr.clickAnywhereButHere);
})
}
}
})
Вот пример решения A: нажмите здесь
Когда вы нажимаете на первый раскрывающийся список, затем работаете, затем нажимаете второй ввод, первый должен скрываться, но нет.
Решение B:
app.directive('clickAnywhereButHere', ['$document', function ($document) {
directiveDefinitionObject = {
link: {
pre: function (scope, element, attrs, controller) { },
post: function (scope, element, attrs, controller) {
onClick = function (event) {
var isChild = element.has(event.target).length > 0;
var isSelf = element[0] == event.target;
var isInside = isChild || isSelf;
if (!isInside) {
scope.$apply(attrs.clickAnywhereButHere)
}
}
$document.click(onClick)
}
}
}
return directiveDefinitionObject
}]);
Вот пример для решения B: нажмите здесь
Решение A работает, если на странице есть только одна директива, но не в моем приложении. Поскольку это предотвращает пузыри, так что сначала, когда я нажимаю на dropdown1, покажу dropdown1, затем нажмите dropdown2, нажмите событие, чтобы предотвратить, поэтому dropdown1 все еще показывает, что даже я выхожу за пределы dropdown1.
Решение B работает в моем приложении, которое я использую сейчас. Но проблема в том, что это вызывает проблемы с производительностью. Слишком много событий клика обрабатываются при каждом нажатии на любое приложение. В моем текущем случае существует 8 привязок к событию с документом, поэтому каждый клик выполняет 8 функций. Что вызывает мое приложение очень медленно, особенно в IE8.
Так есть ли лучшее решение для этого? Благодаря