我想要一个用户可以清除所选值的md-select。例如。他们选择一个值,但决定要清除他们的选择。
md-select的行为是选择选项中的第一个条目。我想让它回到没有选择的状态。
我想象我可能需要一个自定义指令,所以我实现了一个简单的指令,它监听DELETE键的keydown。
HTML:
<div ng-controller="AppCtrl as ctrl" class="md-padding selectdemoBasicUsage" ng-cloak="" ng-app="MyApp">
<div>
<h1 class="md-title">Select a state</h1>
<span>I want the DELETE key to be able to clear the selected state.</span>
<div layout="row">
<md-input-container>
<label>State</label>
<md-select ng-model="ctrl.userState" select-clear>
<md-option ng-repeat="state in ctrl.states" value="{{state.abbrev}}">
{{state.abbrev}}
</md-option>
</md-select>
</md-input-container>
</div>
</div>
</div>
JS:
(function () {
'use strict';
angular
.module('MyApp',['ngMaterial', 'ngMessages'])
.controller('AppCtrl', function() {
this.userState = '';
this.states = ('AL AK AZ AR CA CO CT DE FL GA HI ID IL IN IA KS KY LA ME MD MA MI MN MS ' +
'MO MT NE NV NH NJ NM NY NC ND OH OK OR PA RI SC SD TN TX UT VT VA WA WV WI ' +
'WY').split(' ').map(function (state) { return { abbrev: state }; });
})
.directive('selectClear', function() {
return {
restrict: 'A',
require: 'ngModel',
link : function(scope, iElement, iAttrs, ngModelCtrl) {
iElement.bind('keydown', function(event) {
if (event.keyCode === 46) {
ngModelCtrl.$setViewValue('', event);
}
})
}
}
});
})();
这是我的代码笔:
http://codepen.io/craigsh/pen/GorpVV
但它不起作用 - 当按下DELETE键时,选择了第一个选项值。
答案 0 :(得分:6)
我建议使用&#34; null&#34;选项以及州名单:
<md-select ng-model="ctrl.userState" select-clear>
<md-option value="{{null}}">
-- select a state --
</md-option>
<md-option ng-repeat="state in ctrl.states" value="{{state.abbrev}}">
{{state.abbrev}}
</md-option>
</md-select>
所以工作片段(改编自你的)可以是:
答案 1 :(得分:6)
在Angular-material文档中,他们将md-select的值设置为undefined
$scope.clearValue = function() {
$scope.myModel = undefined;
};
您也可以在其网站https://material.angularjs.org/latest/demo/select中查看验证部分
答案 2 :(得分:0)
最后,我实现了一个非常好的指令:
.directive('selectClear', function($parse) {
return {
restrict: 'A',
require: 'ngModel',
link : function(scope, iElement, iAttrs) {
iElement.bind('keydown', function(event) {
if (event.keyCode === 46) {
event.preventDefault();
event.stopPropagation();
scope.$evalAsync(function() {
var modelGetter = $parse(iAttrs['ngModel']),
modelSetter = modelGetter.assign;
modelSetter(scope, '');
});
}
})
}
}
}
答案 3 :(得分:0)
我做了一个简单的指示来照顾我。
angular.module 'app.components'
.directive 'deleteWhenBlank', ->
directive =
restrict: 'A'
require: ['ngModel']
scope:
model: '=ngModel'
link: ($scope, el, attrs) ->
$scope.$watch('model', (value) ->
unless value
delete $scope.model
)
我像这样使用它,它适用于所示的示例。只要md-select失去焦点,模型就会设置为null。
<md-select ng-model='some.model' delete-when-blank>
<md-option value=''></md-option>
<md-option value='{{undefined}}'></md-option>
<md-option value='{{null}}'></md-option>
</md-select>
答案 4 :(得分:0)
我迟到了,这可能是角度素材库中的演变,但有可能将md-option-empty
添加到md-option
以将其标记为空的等效物。
<md-option md-option-empty ng-value="undefined">No selection</md-option>
这将显示&#34; No selection&#34;列表中的选项,一旦选中,将使输入为空(并将undefined
传递给ng-model
)。
Cf doc
答案 5 :(得分:0)
我也来晚了,但是在html中添加了一个模板选择变量:
<button (click)="selectAll(selectField)">Deselect All</button>
<mat-select #selectField>
<mat-option
*ngFor="let option of options | async"
[value]="option.id">
{{option.text}}
</mat-option>
</mat-select>
和ts:
public deselectAll() {
selectField.value = [];
}
取消选择所有复选框并重置材料选择。