Это дополнительный вопрос к этому вопросу: AngularJS input with focus kills ng-repeat filter of listНе знаю, как скрыть DIV при щелчке за пределы DIV
В основном мой код использует AngularJS поп-выход в DIV (выдвижной ящик) на для фильтрации списка вещей. В большинстве случаев этот пользовательский интерфейс блокируется, поэтому нажатие на блокирующий div закрывает ящик. Но в некоторых случаях мы не блокируем пользовательский интерфейс и должны позволить пользователю щелкнуть за пределами ящика, чтобы отменить поиск или выбрать что-то еще на странице.
Моя первоначальная мысль заключалась в том, чтобы прикрепить оконный обработчик window.onclick, когда выдвижной ящик открывается, и если что-либо щелкнуто, кроме ящика, оно должно закрыть ящик. Вот как я сделал бы это в чистом приложении для JavaScript. Но в Angular это немного сложнее.
Вот jsfiddle с образцом, который я на основе @ примере 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();
}
}
Большое спасибо @Bertrand! То, что $ apply было именно тем, что мне не хватало! Я нахожусь на 5-й день использования Angular (профессионально) - все-таки некоторые ключевые понятия, на которые мне понадобится время, чтобы ознакомиться! Надеюсь, я смогу вернуть благосклонность в ближайшем будущем! Я проверю, что JSBin для директивы, и опубликуйте результаты, когда это будет сделано и работает. –