code: function SidenavController($scope, $attrs, $mdComponentRegistry, $q, $interpolate) {
  
    var self = this;
  
    // Use Default internal method until overridden by directive postLink
  
    // Synchronous getters
    self.isOpen = function() { return !!$scope.isOpen; };
    self.isLockedOpen = function() { return !!$scope.isLockedOpen; };
  
    // Synchronous setters
    self.onClose = function (callback) {
      self.onCloseCb = callback;
      return self;
    };
  
    // Async actions
    self.open   = function() { return self.$toggleOpen( true );  };
    self.close  = function() { return self.$toggleOpen( false ); };
    self.toggle = function() { return self.$toggleOpen( !$scope.isOpen );  };
    self.$toggleOpen = function(value) { return $q.when($scope.isOpen = value); };
  
    // Evaluate the component id.
    var rawId = $attrs.mdComponentId;
    var hasDataBinding = rawId && rawId.indexOf($interpolate.startSymbol()) > -1;
    var componentId = hasDataBinding ? $interpolate(rawId)($scope.$parent) : rawId;
  
    // Register the component.
    self.destroy = $mdComponentRegistry.register(self, componentId);
  
    // Watch and update the component, if the id has changed.
    if (hasDataBinding) {
      $attrs.$observe('mdComponentId', function(id) {
        if (id && id !== self.$$mdHandle) {
          self.destroy(); // `destroy` only deregisters the old component id so we can add the new one.
          self.destroy = $mdComponentRegistry.register(self, id);
        }
      });
    }
  }
docs: /*
  @private
  @ngdoc controller
  @name SidenavController
  @module material.components.sidenav