@@ -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 */
258262function 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