Angularjs 自定义指令 (下拉菜单)
为什么要自定义控件?html的select 不是可以用么?以前我就是这么想的,当我接到特殊需求时,需要我自己写一个下拉控件。
这个需求就是将图表横向放大,由于H5不能控制设备转向,所以我将图表通过css控制顺时针旋转90度。这时设备还是竖屏的,所以即使你将select空间旋转90度,当你点击下拉选项时,会发现选项是竖屏展示的。(不管是Android还是ios 均对h5的select 进行优化,即不在是网页那种显示方式,而是下方出现选项的弹框)这样就不合适了。需要你去写个select 组件了。
由于我使用的是Angularjs ,所以组件需要使用指定(directive) 来完成,
1 angular.module('app') 2 .directive('dropDown', [function () { 3 return { 4 restrict : 'EA', 5 replace : true, 6 transclude : true, 7 scope : { 8 selecttitle : '=', //// 默认选中值 9 lidata:'=lidata', //// 数据集如['张三','李四','王五'] 10 clickChange:'&', //// 选项变化时事件 11 disabled:'@' //// 是否显示,支持表达式 12 }, 13 template:'<div class="ddl" ng-show="disabled">' 14 +'<div class="ddlTitle" ng-click="toggle()"><span ng-bind="selecttitle"></span><i class="fa fa-angle-down ddli"></i></div>' 15 +'<ul ng-show="showMe">' 16 +' <li ng-repeat="data in lidata" ng-click="clickLi(\'{{data}}\')">{{data}}</li>' 17 +'</ul>' 18 +'</div>', 19 link: function ($scope, $element, $attrs) { 20 21 $scope.showMe = false; 22 $scope.disabled = true; 23 24 $scope.toggle = function toggle() { 25 $scope.showMe = !$scope.showMe; 26 }; 27 28 $scope.clickLi=function clickLi(data_){ 29 $scope.selecttitle=data_; 30 $scope.showMe = !$scope.showMe; 31 }; 32 33 $scope.$watch('selecttitle', function(value) { 34 $scope.clickChange(); 35 }); 36 37 /*$scope.$watch( function() { 38 return $scope.$eval($attrs.setNgAnimate, $scope); 39 }, function(valnew, valold){ 40 $animate.enabled(!!valnew, $element); 41 });*/ 42 } 43 }; 44 }]);
Angularjs 控制器代码
1 app.controller('***Ctl',[function(){ 2 3 $scope.currentEnttiy={}; 4 $scope.currentMetric=""; 5 6 7 $scope.initPage = function() { 8 ...... 9 $scope.changeSelect(); 10 } 11 12 13 //// 下拉选项变化时触发 14 $scope.changeSelect=function(){ 15 ...... 16 } 17 18 $scope.initPage(); 19 20 }];
Html代码
1 <html> 2 <head> 3 <title>hello jackical</title> 4 </head> 5 <body> 6 7 <drop-down selecttitle="currentMetric" lidata="currentEnttiy.metricNameList" click-Change="changeSelect()"></drop-down> 8 9 </body> 10 </html>
css 样式
1 .ddl{ 2 position: relative; 3 padding:2px; 4 cursor: pointer; 5 background-color: #FAFAFA; 6 width:254px; 7 float: left; 8 } 9 .ddlTitle{ 10 height: 40px; 11 line-height: 35px; 12 padding: 2px; 13 padding-left: 5px; 14 padding-right: 5px; 15 border: solid #cccccc 1px; 16 font-size: 13px; 17 } 18 .ddlTitle span{ 19 margin-right: 10px; 20 color: #58D0E1; 21 padding-left: 5px; 22 } 23 .ddl ul li{ 24 list-style:none; 25 border-top: dotted #cccccc 1px; 26 line-height: 40px; 27 padding-left: 5px; 28 } 29 .ddl ul{ 30 position:absolute; 31 top:40px; 32 width:250px; 33 left:2px; 34 border: solid #cccccc 1px; 35 z-index: 3; 36 background-color: white; 37 padding:2px; 38 } 39 .ddli{ 40 font-size: 20px; 41 float: right; 42 margin-top: 5px; 43 }
以上为实现代码片段。
附效果图:
转载请注明出处:http://www.cnblogs.com/jackicalSong/
OK ,代码己贴完。