代码之家  ›  专栏  ›  技术社区  ›  arunmmanoharan

保持md select打开,直到单击outside-AngularJS

  •  0
  • arunmmanoharan  · 技术社区  · 6 年前

    我正在使用md select rendering md checkbox wiyth a selectAll选项。

    如果我选择全部,所有复选框都会被选中,下拉列表会关闭。

    如果选择了除“全部”以外的任何值并单击“外部”将其关闭,如何触发不关闭下拉列表?

    var app = angular.module('BlankApp', ['ngMaterial', 'ngMessages']);
    
    app.controller('mdSelectController', function($scope, $mdPanel, $mdSidenav, $mdDialog) {
    
      $scope.helpers = [{
          name: 'All',
          selected: false
        },
        {
          name: 'Ron',
          selected: false
        },
        {
          name: 'Jim',
          selected: false
        },
        {
          name: 'John',
          selected: false
        },
        {
          name: 'Paul',
          selected: false
        },
        {
          name: 'Jeremie',
          selected: false
        }
      ];
    
      $scope.changeCheckbox = function(rating) {
      console.log(rating)
        if (rating.name === 'All' && rating.selected === true) {
          _.forEach($scope.helpers, function(item) {
            item.selected = true;
          });
        }
        if (rating.name === 'All' && rating.selected === false) {
          _.forEach($scope.helpers, function(item) {
            item.selected = false;
          });
        }
        if (rating.name !== 'All') {
          console.log("Not all");
          _.forEach($scope.helpers, function(item) {
            if (item.name === 'All') {
              item.selected = false;
            }
          });
        }
      };
    
    });
    <html lang="en">
    
    <head>
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <!-- Angular Material style sheet -->
      <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.8/angular-material.min.css">
    </head>
    
    <body ng-app="BlankApp" ng-controller="mdSelectController" ng-cloak>
      <!--
        Your HTML content here
      -->
    
      <!-- Angular Material requires Angular.js Libraries -->
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular-animate.min.js"></script>
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular-aria.min.js"></script>
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular-messages.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
    
      <!-- Angular Material Library -->
      <script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.8/angular-material.min.js">
      </script>
      <md-input-container>
        <label>Rating</label>
        <md-select id="ratingDropdown" ng-model="automationRatingObj" md-container-class="ratingDropdown" required="required">
          <md-option ng-value="rating" ng-repeat="rating in helpers track by $index">
            <md-checkbox ng-model="rating.selected" aria-label="Select a Rating" ng-change="changeCheckbox(rating)"></md-checkbox>{{rating.name}}
          </md-option>
        </md-select>
      </md-input-container>
    
    </body>
    
    </html>

    请给我建议。我检查了mdselect的API,但是他们没有任何代码来保持下拉列表的打开。另外,如何禁用md select中的文本并启用click only for复选框?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Athanasios Babasidis    6 年前

    您希望在单击“全部”时关闭下拉列表,但在单击任何其他项时保持打开状态。您可以在重复和添加中检查所处的值$事件.停止播放();不带“all”的所有对象。您可以在ng click on md选项上使用三元运算符:ng click=“评级名称!='全部'?$事件.停止播放(): ''"

    var app = angular.module('BlankApp', ['ngMaterial', 'ngMessages']);
    
    app.controller('mdSelectController', function($scope, $mdPanel, $mdSidenav, $mdDialog) {
    
      $scope.helpers = [{
          name: 'All',
          selected: false
        },
        {
          name: 'Ron',
          selected: false
        },
        {
          name: 'Jim',
          selected: false
        },
        {
          name: 'John',
          selected: false
        },
        {
          name: 'Paul',
          selected: false
        },
        {
          name: 'Jeremie',
          selected: false
        }
      ];
    
      $scope.changeCheckbox = function(rating) {
      console.log(rating)
        if (rating.name === 'All' && rating.selected === true) {
          _.forEach($scope.helpers, function(item) {
            item.selected = true;
          });
        }
        if (rating.name === 'All' && rating.selected === false) {
          _.forEach($scope.helpers, function(item) {
            item.selected = false;
          });
        }
        if (rating.name !== 'All') {
          console.log("Not all");
          _.forEach($scope.helpers, function(item) {
            if (item.name === 'All') {
              item.selected = false;
            }
          });
        }
      };
    
    });
    <html lang="en">
    
    <head>
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <!-- Angular Material style sheet -->
      <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.8/angular-material.min.css">
    </head>
    
    <body ng-app="BlankApp" ng-controller="mdSelectController" ng-cloak>
      <!--
        Your HTML content here
      -->
    
      <!-- Angular Material requires Angular.js Libraries -->
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular-animate.min.js"></script>
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular-aria.min.js"></script>
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular-messages.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
    
      <!-- Angular Material Library -->
      <script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.8/angular-material.min.js">
      </script>
      <md-input-container>
        <label>Rating</label>
        <md-select id="ratingDropdown" ng-model="automationRatingObj" md-container-class="ratingDropdown" required="required">
          <md-option ng-value="rating" ng-repeat="rating in helpers track by $index" ng-click="rating.name != 'All' ? $event.stopPropagation(): ''" >
            <md-checkbox ng-model="rating.selected" aria-label="Select a Rating" ng-change="changeCheckbox(rating)"></md-checkbox>{{rating.name}}
          </md-option>
        </md-select>
      </md-input-container>
    
    </body>
    
    </html>
        2
  •  1
  •   Matej Marconak    6 年前

    你可以用 multiple md-select 而不是使用 md-checkbox . changeCheckbox 功能-用于选择 ALL

    像这样:

    <md-select id="ratingDropdown" ng-model="automationRatingObj" md-container-class="ratingDropdown" required="required" multiple="true" ng-change="changeCheckbox()">
          <md-option ng-value="rating" ng-repeat="rating in helpers track by $index" >
            {{rating.name}}
          </md-option>
        </md-select>