Это следующий вопрос по этому вопросу: Вход AngularJS с фокусом убивает фильтр ng-repeat списка
В основном мой код использует AngularJS для выпадания div (ящика) справа для фильтрации списка вещей. В большинстве случаев этот пользовательский интерфейс блокируется, поэтому нажатие на блокирующий div закрывает ящик. Но в некоторых случаях мы не блокируем пользовательский интерфейс и должны позволить пользователю щелкнуть за пределами ящика, чтобы отменить поиск или выбрать что-то еще на странице.
Моя первоначальная мысль заключалась в том, чтобы прикрепить обработчик window.onclick, когда ящик открывается, и если что-либо щелкнуто, кроме ящика, оно должно закрыть ящик. Это как я сделал бы это в чистом приложении для JavaScript. Но в Angular это немного сложнее.
Вот пример jsfiddle с образцом, который я основал на примере @Yoshi jsBin: http://jsfiddle.net/tpeiffer/kDmn8/
Ниже приведен соответствующий фрагмент кода из этого примера. В основном, если пользователь щелкает за пределами ящика, я вызываю $scope.toggleSearch, так что $scope.open возвращается к false.
Код работает, и даже если $scope.open переходит от истинного к false, он не изменяет DOM. Я уверен, что это имеет какое-то отношение к жизненному циклу событий или, возможно, когда я изменяю $scope (поскольку это из отдельного события), что это копия, а не оригинал...
Конечная цель в этом будет заключаться в том, чтобы она была директивой для окончательного повторного использования. Если кто-то может указать мне в правильном направлении, я буду благодарен.
$scope.toggleSearch = function () {
$scope.open = !$scope.open;
if ($scope.open) {
$scope.$window.onclick = function (event) {
closeSearchWhenClickingElsewhere(event, $scope.toggleSearch);
};
} else {
$scope.$window.onclick = null;
}
};
и
function closeSearchWhenClickingElsewhere(event, callbackOnClose) {
var clickedElement = event.target;
if (!clickedElement) return;
var elementClasses = clickedElement.classList;
var clickedOnSearchDrawer = elementClasses.contains('handle-right')
|| elementClasses.contains('drawer-right')
|| (clickedElement.parentElement !== null
&& clickedElement.parentElement.classList.contains('drawer-right'));
if (!clickedOnSearchDrawer) {
callbackOnClose();
}
}