Skip to content

Commit dc4b8c4

Browse files
committed
fix(sidenav): allow to hide side nav depending on the media query
Current behavior is not correct Fixes angular#4595
1 parent 2a01746 commit dc4b8c4

File tree

1 file changed

+38
-10
lines changed

1 file changed

+38
-10
lines changed

src/components/sidenav/sidenav.js

+38-10
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ function SidenavService($mdComponentRegistry, $mdUtil, $q, $log) {
113113

114114
return angular.extend({
115115
isLockedOpen: falseFn,
116+
isLockedClosed: falseFn,
116117
isOpen: falseFn,
117118
toggle: rejectFn,
118119
open: rejectFn,
@@ -244,16 +245,19 @@ function SidenavFocusDirective() {
244245
* @param {expression=} md-is-locked-open When this expression evaluates to true,
245246
* the sidenav 'locks open': it falls into the content's flow instead
246247
* of appearing over it. This overrides the `md-is-open` attribute.
248+
* @param {expression=} md-is-locked-closed When this expression evaluates to true,
249+
* the sidenav 'locks closed': hides sidenav.
247250
* @param {string=} md-disable-scroll-target Selector, pointing to an element, whose scrolling will
248251
* be disabled when the sidenav is opened. By default this is the sidenav's direct parent.
249252
*
250-
* The $mdMedia() service is exposed to the is-locked-open attribute, which
253+
* The $mdMedia() service is exposed to the is-locked-open and is-locked-closed attributes, which
251254
* can be given a media query or one of the `sm`, `gt-sm`, `md`, `gt-md`, `lg` or `gt-lg` presets.
252255
* Examples:
253256
*
254257
* - `<md-sidenav md-is-locked-open="shouldLockOpen"></md-sidenav>`
255258
* - `<md-sidenav md-is-locked-open="$mdMedia('min-width: 1000px')"></md-sidenav>`
256259
* - `<md-sidenav md-is-locked-open="$mdMedia('sm')"></md-sidenav>` (locks open on small screens)
260+
* - `<md-sidenav md-is-locked-closed="$mdMedia('sm')"></md-sidenav>` (locks closed on small screens)
257261
*/
258262
function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $mdInteraction, $animate,
259263
$compile, $parse, $log, $q, $document, $window, $$rAF) {
@@ -282,8 +286,9 @@ function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $mdInterac
282286
var previousContainerStyles;
283287
var promise = $q.when(true);
284288
var isLockedOpenParsed = $parse(attr.mdIsLockedOpen);
289+
var isLockedClosedParsed = $parse(attr.mdIsLockedClosed);
285290
var ngWindow = angular.element($window);
286-
var isLocked = function() {
291+
var isLockedOpen = function() {
287292
return isLockedOpenParsed(scope.$parent, {
288293
$media: function(arg) {
289294
$log.warn("$media is deprecated for is-locked-open. Use $mdMedia instead.");
@@ -292,6 +297,15 @@ function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $mdInterac
292297
$mdMedia: $mdMedia
293298
});
294299
};
300+
var isLockedClosed = function() {
301+
return isLockedClosedParsed(scope.$parent, {
302+
$media: function(arg) {
303+
$log.warn("$media is deprecated for is-locked-closed. Use $mdMedia instead.");
304+
return $mdMedia(arg);
305+
},
306+
$mdMedia: $mdMedia
307+
});
308+
};
295309

296310
if (attr.mdDisableScrollTarget) {
297311
disableScrollTarget = $document[0].querySelector(attr.mdDisableScrollTarget);
@@ -336,7 +350,8 @@ function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $mdInterac
336350
backdrop && backdrop.remove();
337351
});
338352

339-
scope.$watch(isLocked, updateIsLocked);
353+
scope.$watch(isLockedOpen, updateIsLockedOpen);
354+
scope.$watch(isLockedClosed, updateIsLockedClosed);
340355
scope.$watch('isOpen', updateIsOpen);
341356

342357

@@ -345,18 +360,30 @@ function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $mdInterac
345360

346361
/**
347362
* Toggle the DOM classes to indicate `locked`
348-
* @param isLocked
363+
* @param isLockedOpen
349364
* @param oldValue
350365
*/
351-
function updateIsLocked(isLocked, oldValue) {
352-
scope.isLockedOpen = isLocked;
353-
if (isLocked === oldValue) {
354-
element.toggleClass('md-locked-open', !!isLocked);
366+
function updateIsLockedOpen(isLockedOpen, oldValue) {
367+
scope.isLockedOpen = isLockedOpen;
368+
if (isLockedOpen === oldValue) {
369+
element.toggleClass('md-locked-open', !!isLockedOpen);
355370
} else {
356-
$animate[isLocked ? 'addClass' : 'removeClass'](element, 'md-locked-open');
371+
$animate[isLockedOpen ? 'addClass' : 'removeClass'](element, 'md-locked-open');
357372
}
358373
if (backdrop) {
359-
backdrop.toggleClass('md-locked-open', !!isLocked);
374+
backdrop.toggleClass('md-locked-open', !!isLockedOpen);
375+
}
376+
}
377+
378+
/**
379+
* Toggle the DOM classes to indicate `locked`
380+
* @param isLockedClosed
381+
* @param oldValue
382+
*/
383+
function updateIsLockedClosed(isLockedClosed, oldValue) {
384+
scope.isLockedClosed = isLockedClosed;
385+
if (true === !!isLockedClosed) {
386+
sidenavCtrl.close();
360387
}
361388
}
362389

@@ -535,6 +562,7 @@ function SidenavController($scope, $attrs, $mdComponentRegistry, $q, $interpolat
535562
// Synchronous getters
536563
self.isOpen = function() { return !!$scope.isOpen; };
537564
self.isLockedOpen = function() { return !!$scope.isLockedOpen; };
565+
self.isLockedClosed = function() { return !!$scope.isLockedClosed; };
538566

539567
// Synchronous setters
540568
self.onClose = function (callback) {

0 commit comments

Comments
 (0)