Держите md-select открытым, пока не щелкнете снаружи - AngularJS

Я использую md-select рендеринга md-checkbox с параметром 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>

Пожалуйста посоветуй. Я проверил API md-select, но у них нет кода, чтобы держать раскрывающийся список открытым. Кроме того, как отключить щелчок по тексту внутри md-select и включить щелчок только для флажка?


person a2441918    schedule 17.09.2018    source источник


Ответы (2)


Вы хотите, чтобы раскрывающийся список закрывался при нажатии на все, но оставался открытым при нажатии на любой другой элемент. Вы можете проверить, какое значение у вас есть в ng-repeat, и добавить $event.stopPropagation(); ко всем объектам без «Все». Вы можете сделать это, используя тернарный оператор при ng-click на md-option: ng-click="rating.name != 'All' ? $event.stopPropagation(): ''"

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>

person Athanasios Babasidis    schedule 17.09.2018
comment
Один небольшой вопрос: есть ли способ отключить щелчок по тексту и включить только щелчок по флажку? - person a2441918; 18.09.2018
comment
@ a2441918 a2441918 вы можете изменить ng-click на md-option просто на $event.stopPropagation(), а затем добавить тернарный оператор rating.name != 'All'? $event.stopPropagation(): '' в элемент md-checkbox. Это предотвратит действия по щелчку на чем-либо, кроме флажка. - person Athanasios Babasidis; 19.09.2018

Вы можете использовать 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>
person Matej Marconak    schedule 17.09.2018
comment
Я сделал это, но не могу получить доступ к выбранному свойству флажка. - person a2441918; 17.09.2018
comment
добавить в функцию changeCheckbox - console.log($scope. automationRatingObj) - person Matej Marconak; 17.09.2018
comment
который содержит выбранные элементы - вы можете проверить этот массив и пометить объект. - person Matej Marconak; 17.09.2018