Angularjs单选改为多选的开发过程及问题解析
很简单的需求:之前下拉框是单选,现在想改为多选。
开发过程:
问题一:自己首先想到的是网上找个example,发现貌似AngularJS有相应的js包来实现,其中最多的就是isteven-multi-select和angularjs-dropdown-multiselect等。
我下载了,但是套到自己项目里面,是在是难看的很。而且貌似这些js包耦合性很高,不是我想要的那种,所以还是打算用简单的md-select、md-option、md-checkbox
来实现我想要的效果,又不想写的太人工,所以就查angularjs的一些控件demo,最后果然发现了我想要的。
https://material.angularjs.org/1.1.3/demo/select
于是我就开始往项目里套,但是怎么套,都出不了demo上的样式,多选是能多选了,但是没有像checkbox那种正方形选择框,各种百度各种google,就是不知道什么原因。本来打算都要放弃了,但是这么好的demo,这么省事的js,不忍心放弃啊,再说放弃也找不到其他比较合适的而又不显突兀的样式。于是耐下心来一遍遍的去看setting,所有的都没问题,除了版本不一致。难道?我的第六感告诉我,或许真的是版本原因。之前用的版本是"angular-material":"1.0.0-rc2",改用最新版本"angular-material":"1.1.3",于是,效果出来了,真的是版本原因,容我默默的在卫生间哭一会儿。
问题二:样式的问题解决了,离成功不远了。想做个多选效果,因为选项实在是很多,没有多选实在是体验不好。于是就用其中的一个option来做全选,但是不知道option都有什么事件,找不到相应的属性说明文档,只有一个checked属性,但是在js里面又不知道如何判断checked还是没有checked,最后还是放弃了,最上面做了个按钮,搞定。
问题三:还有个问题,就是更新"angular-material":"1.1.3"版本之后,似乎md-input-Containerlabel长度过长的话,就显示3Dot(...)了,而之前是可以换行显示的,感觉这个体验完全不如之前版本的体验。网上google了好久也没google出来这样修正的好处,于是果断自定义css,改回原来的样式。
涉及到的部分代码:
html:
<md-input-containerflex="35"class="md-input-has-value"> <label>产品类型</label> <md-selectng-model="params.productType"md-on-close="clearSearchTerm()"ng-change="change(params.productType)"data-md-container-class="selectHeader"multiple> <div> <buttonng-click="pTCheckNone()"class="md-buttonmd-ink-ripple"><iclass="zmdizmdi-undong-scope"></i>重置</button> </div> <md-select-headerclass="select-header"> <inputng-model="searchTerm"type="search"placeholder="Searchforaproduct.."class="header-searchboxmd-text"> </md-select-header> <md-optgrouplabel="productTypes"> <md-optionvalue="{{item.key}}"ng-repeat="iteminproductTypes|filter:searchTerm">{{item.value}}</md-option> </md-optgroup> </md-select> </md-input-container>
js:
$scope.productTypes=[ {"key":"SecureSiteProEV1","value":"product1"}, {"key":"SecureSiteProEV2","value":"product2"}, {"key":"SecureSiteProEV3","value":"product3"}, {"key":"SecureSiteProEV4","value":"product4"}, {"key":"SecureSiteProEV5","value":"product5"}];
css
md-input-containerlabel:not(.md-no-float):not(.md-container-ignore), md-input-container.md-placeholder{ white-space:normal; }