これはこの質問に対するフォローアップの質問です: AngularJS input with focus kills ng-repeat filter of list
基本的に、私のコードは AngularJS を使用して、右側に div (ドロワー) をポップアウトし、リストをフィルタリングしています。ほとんどの場合、これは UI がブロックされているため、ブロックしている div をクリックするとドロワーが閉じます。ただし、場合によっては、UI をブロックせず、ユーザーがドロワーの外側をクリックして検索をキャンセルしたり、ページ上の何かを選択したりできるようにする必要があります。
私の最初の考えは、引き出しが開いたときに window.onclick ハンドラーをアタッチし、引き出し以外のものがクリックされた場合は引き出しを閉じることでした。それが、純粋な JavaScript アプリで行う方法です。しかし、Angular では少し難しくなっています。
これは、@ YoshiのjsBinの例に基づいたサンプルを含むjsfiddleです: http://jsfiddle.net/tpeiffer/kDmn8/
このサンプルの関連するコードは次のとおりです。基本的に、ユーザーがドロワーの外側をクリックすると、$scope.toggleSearch が呼び出され、$scope.open が false に戻されます。
コードは機能し、$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();
}
}