這是一個後續問題這個問題:AngularJS input with focus kills ng-repeat filter of list不知道如何點擊股利之外時,隱藏一個div
基本上我的代碼使用AngularJS彈出出的一個div(抽屜)過濾一系列事物的權利。大多數情況下,這是用來阻止用戶界面的,因此點擊該阻塞格就會關閉抽屜。但在某些情況下,我們不會阻止用戶界面,並且需要允許用戶在抽屜外單擊以取消搜索或在頁面上選擇其他內容。
我最初的想法是在抽屜打開時附加一個window.onclick處理程序,並且如果除抽屜外的任何東西被點擊,它應關閉抽屜。這就是我在純粹的JavaScript應用程序中做到的。但是在Angular中它會更難一些。
這裏是與我基於@ Yoshi的jsBin例的樣品的jsfiddle:http://jsfiddle.net/tpeiffer/kDmn8/
從該樣品有關的代碼如下。基本上,如果用戶點擊抽屜外部,我調用$ scope.toggleSearch,以便$ scope.open設置爲false。
代碼有效,即使$ scope.open從true變爲false,它也不會修改DOM。我確信這與事件的生命週期有關,或者當我修改$範圍(因爲它來自單獨事件)它是一個副本而不是原始的...
最終目標這將是它的最終可重用性指令。如果有人能指出我正確的方向來做到這一點,我將不勝感激。
$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!那$申請正是我錯過的!我在使用Angular(專業)的第5天 - 仍然需要一段時間來熟悉一些關鍵概念!希望我能在不久的將來回報這份青睞!我將檢查該JSBin的指令,併發布結果,當它完成並工作。 –