이이 질문에 대한 후속 질문은 AngularJS input with focus kills ng-repeat filter of list 기본적으로확실하지
내 코드는 팝 아웃하기에 사업부 (서랍) AngularJS와를 사용하고 있습니다 사물 목록을 필터링하는 데 적합합니다. 대부분이 시간은 UI가 차단되어 블로킹 div를 클릭하면 서랍이 닫힙니다. 그러나 경우에 따라 UI를 차단하지 않으므로 사용자가 서랍 외부를 클릭하여 검색을 취소하거나 페이지에서 다른 항목을 선택할 수 있도록해야합니다.
처음에는 서랍이 열리면 window.onclick 처리기를 부착하고 서랍 이외의 다른 것이 클릭되면 서랍을 닫아야한다고 생각했습니다. 이것이 내가 순수한 자바 스크립트 앱에서하는 방법입니다. 그러나 Angular에서는 좀 더 어려워졌습니다. http://jsfiddle.net/tpeiffer/kDmn8/이
이 샘플에서 코드의 관련 부분은 다음과 같습니다 : 여기
내가 요시의 jsBin 예 @ 기반으로 샘플과 jsfiddle입니다. 기본적으로 사용자가 서랍 외부를 클릭하면 $ scope.open이 false로 다시 설정되도록 $ scope.toggleSearch를 호출합니다.코드가 작동하며 $ scope.open이 true에서 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는 정확히 제가 누락 된 것입니다! 저는 Angular (전문적으로)를 사용하는 날 5에 있습니다 - 여전히 익숙해지기까지 잠시 시간을 할애 할 핵심 개념! 바라기를 나는 가까운 장래에 부탁을 돌려받을 수 있습니다! JSBin에서 지시문을 확인하고 작업이 완료되면 결과를 게시합니다. –