Jest to kontynuacja pytanie na to pytanie: AngularJS input with focus kills ng-repeat filter of listNie wiem, jak ukryć div po kliknięciu poza div
Zasadniczo mój kod używa angularjs pop-out div (szuflada) na prawo do filtrowania listy rzeczy. W większości przypadków jest używany blokowany interfejs użytkownika, więc kliknięcie tego bloku blokującego zamyka szufladę. Jednak w niektórych przypadkach nie blokujemy interfejsu użytkownika i musimy pozwolić użytkownikowi na kliknięcie poza szufladą, aby anulować wyszukiwanie lub wybrać coś innego na stronie.
Moja początkowa myśl polegała na tym, aby dołączyć szufladkę window.onclick, gdy szuflada się otworzy i jeśli cokolwiek zostanie kliknięte poza szufladą, należy zamknąć szufladę. Tak właśnie zrobiłbym w czystej aplikacji JavaScript. Ale w Angularie jest to trochę trudniejsze.
Oto jsfiddle z próbką, że w oparciu o @ jsBin przykład Yoshi: http://jsfiddle.net/tpeiffer/kDmn8/
Odpowiedni fragment kodu z tej próbki jest poniżej. Zasadniczo, jeśli użytkownik kliknie poza szufladę, wywołuję $ scope.toggleSearch, aby $ scope.open powrócił do wartości false.
Kod działa, i chociaż $ scope.open przechodzi od wartości true do false, nie modyfikuje DOM. Jestem pewien, że ma to coś wspólnego z cyklem życia wydarzeń lub kiedy modyfikuję $ scope (ponieważ pochodzi z osobnego wydarzenia), że jest to kopia, a nie oryginał ...
Ostatecznym celem będzie to stanowić dyrektywę o ostatecznym wykorzystaniu. Jeśli ktokolwiek może wskazać mi właściwy kierunek, będę wdzięczny.
$scope.toggleSearch = function() {
$scope.open = !$scope.open;
if ($scope.open) {
$scope.$window.onclick = function (event) {
closeSearchWhenClickingElsewhere(event, $scope.toggleSearch);
};
} else {
$scope.$window.onclick = null;
}
};
i
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();
}
}
Dziękuję bardzo @Bertrand! Ten $ apply był dokładnie tym, czego mi brakowało! Jestem w piątym dniu korzystania z Angular (profesjonalnie) - wciąż kilka kluczowych koncepcji, które zabiorą mi trochę czasu na zapoznanie się! Mam nadzieję, że zwrócę przysługę w najbliższej przyszłości! Sprawdzę JSBin pod kątem dyrektywy i opublikuję wyniki, gdy już to zrobię i działam. –