无论如何要将 ng-click 添加到 md-backdrop?

Is there anyway to add an ng-click to md-backdrop?

我有一个 angular 应用需要在打开或关闭 sidenav 时切换状态。这在打开 sidenav 并通过关闭按钮关闭它时工作正常。但是,如果用户通过单击 sidenav 外部来关闭 sidenav,我需要将 ng-click 附加到 md-backdrop。有没有其他人遇到过这个问题,或者有没有人知道如何实现这个问题?任何帮助将不胜感激。

Sidenav 允许您绑定一个 "md-is-open" 参数,该参数根据 sidenav 是打开还是关闭而为真或假。如果您通过单击背景关闭 sidenav,Sidenav 将更新它。您可以绑定此变量并 $watch 它以了解 sidenav 状态,如下所示:

html:

<div layout="row" ng-controller="MyController">
    <md-sidenav md-component-id="left" md-is-open="isSidenavOpen" class="md-sidenav-left">
        Left Nav!
    </md-sidenav>
</div>

js:

app.controller('MyController', function($scope, $mdSidenav) {
    $scope.isSidenavOpen = false;

    $scope.$watch('isSidenavOpen', function(isSidenavOpen) {
       alert('sidenav is ' + (isSidenavOpen ? 'open' : 'closed'));
    });
});

jsfiddle 演示:http://jsfiddle.net/qo1gmrrr/

您可以添加自定义背景。你有下面的代码 jsfiddle.

html:

<div ng-app="myapp">
<div layout="row" ng-controller="MyController">
    <md-backdrop class="md-sidenav-backdrop md-opaque md-default-theme md-sidenav-backdrop-custom disabled" ng-click="checkClosingForm()"></md-backdrop>
    <md-sidenav md-component-id="left" class="md-sidenav-left">
        Left Nav!
    </md-sidenav>
     <md-content>
        <md-button ng-click="toggleLeft()">
          Open Side Nav
        </md-button>
      </md-content>
</div>

js:

    var app = angular.module('myapp', ['ngMaterial']);

    app.controller('MyController', function($scope, $mdSidenav) {
      $scope.keepOpen = false;

      $scope.toggleLeft = toggleLeft;

      function toggleLeft(){
        $mdSidenav('left').toggle().then(function () {
                $scope.keepOpen = !$scope.keepOpen;
                if ($scope.keepOpen)
                    angular.element('md-backdrop.md-sidenav-backdrop-custom').removeClass('disabled');
                else
                   angular.element('md-backdrop.md-sidenav-backdrop-custo   
m').addClass('disabled');
        });   
  };

  $scope.checkClosingForm = function(){
      if(true){
          alert('checking...');
          toggleLeft();
      }
  };

});

css:

md-backdrop.md-sidenav-backdrop-custom{
      background-color: transparent !important;
}
md-backdrop.disabled
{
    display:none;
}

当然你可以通过 md-is-open 处理 sidenav open/close,但是你不能阻止关闭它

如果 mb-bottom-sheet 需要事件,请使用 onRemove:

$mdBottomSheet
    .show({
        templateUrl: '_TEMPLATE_FILE_',
        onRemove: function (scope, element, options) {
            var scrollmask = document.getElementsByClassName('md-scroll-mask');
            var backdrop = document.getElementsByTagName('md-backdrop');
            angular.element(scrollmask).remove();
            angular.element(backdrop).remove();
            angular.element(element).remove();
            $mdUtil.enableScrolling();
        }
    });

这是我的解决方案,没有使用 $scope 或 $watch,也没有操纵 DOM:

在我看来:

<md-sidenav class="md-sidenav-left md-whiteframe-4dp" 
            md-swipe-left="drawerCtrl.toggle()"  md-component-id="left">
......
</md-sidenav>
<md-backdrop class="md-sidenav-backdrop" ng-click="drawerCtrl.toggle()" 
             ng-show="drawerCtrl.drawerOpen"></md-backdrop>

在抽屉控制器中:

 this.toggle = function () {    
                $mdSidenav('left').toggle();
                self.drawerOpen = $mdSidenav('left').isOpen();
                ....
    };

当然,在侧边栏 opens/closes 的按钮上:

<md-button ng-click="drawerController.toggle()"></md-button>