AngularJS checkbox的总结

checkbox组件的封装

组件的css样式的实现
这种采用纯css伪类的方式实现,为input组件重写样式。这种方式可以兼容webkit内核的浏览器。





但对于火狐浏览器而言checkbox样式无法重写



        /**/
        .mui-switch {
          width: 60px;
          height: 20px;
          position: relative;
          border: 1px solid #dfdfdf;
          background-color: #fdfdfd;
          box-shadow: #dfdfdf 0 0 0 0 inset;
          background-clip: content-box;
          display: inline-block;
          -webkit-appearance: none;
          -moz-appearance : none;
          user-select: none;
          outline: none; 
          top: 8px;}
        .mui-switch:before {
            display: block;
            content: '';
            width: 27px;
            height: 16px;
            position: absolute;
            top: 1px;
            left: 0;
            background-color: #fff;
            box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); }
        .mui-switch:disabled:before{
            background-color: #dfdfdf;
        }
        .mui-switch:checked {
            border-color: #64bd63;
            box-shadow: #64bd63 0 0 0 16px inset;
            background-color: #64bd63; }
            .mui-switch:checked:before {
              left: 30px; }
        .mui-switch:after {
            width: 20px;
            height: 30px;
            content: '关';
            position: absolute;
            right: 0
        }
        .mui-switch:checked:after {
            width: 20px;
            height: 30px;
            content: '开';
            position: absolute;
            left: 8px;
        }

页面的调用

<input class="mui-switch" type="checkbox" ng-model="item[col.field]" ng-change="col.handler.onChange(item)" ng-disabled="item[col.switchDisableCondition]">

另一种采用label模拟的方式实现的switch样式的checkbox


.slideThree {
  width: 80px;
  height: 26px;
  /*background: #333;*/
  border: 1px solid #eeeeee;
  /*border-color: #64bd63;*/
    /*box-shadow: #64bd63 0 0 0 16px inset;
    background-color: #64bd63;*/
  margin: 20px auto;
  position: relative;
  -moz-border-radius: 50px;/*
  -webkit-border-radius: 50px;
  border-radius: 50px;
  -moz-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.5), 0px 1px 0px rgba(255, 255, 255, 0.2);
  -webkit-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.5), 0px 1px 0px rgba(255, 255, 255, 0.2);
  box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.5), 0px 1px 0px rgba(255, 255, 255, 0.2);*/
}
.slideThree:after {
  content: '关';
  /*color: #000;*/
  position: absolute;
  right: 10px;
  z-index: 0;
  font: 12px/26px Arial, sans-serif;
  font-weight: bold;
  text-shadow: 1px 1px 0px rgba(255, 255, 255, 0.15);
}
.slideThree:before {
  content: '开';
  color: #00bf00;
  position: absolute;
  left: 10px;
  z-index: 0;
  font: 12px/26px Arial, sans-serif;
  font-weight: bold;
}
.slideThree label {
  display: block;
  width: 34px;
  height: 20px;
  cursor: pointer;
  position: absolute;
  top: 3px;
  left: 3px;
  z-index: 1;
  background: #fcfff4;
  /*background: -moz-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
  background: -webkit-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
  background: linear-gradient(to bottom, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
  -moz-border-radius: 50px;
  -webkit-border-radius: 50px;
  border-radius: 50px;*/
  -moz-transition: all 0.4s ease;
  -o-transition: all 0.4s ease;
  -webkit-transition: all 0.4s ease;
  transition: all 0.4s ease;
  -moz-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.3);
  -webkit-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.3);
  box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.3);
}
.slideThree input[type=checkbox] {
  visibility: hidden;
}
.slideThree input[type=checkbox]:checked + label {
  left: 43px;
}

.slideThree input[type=checkbox]:disabled + label {
    background-color: #eeeeee;
}


app.directive('mycheckbox',function(){
    return {
      restrict : 'E',
      replace : true,
      transclude:true,
      scope : {
        disabled : '&?',
        change: '&',
        data : '=ngModel',
        beforechange : '&'
      },
      controller : function($scope){
       

        $scope.toggle = function() {
          if(angular.isFunction($scope.disabled) && $scope.disabled()) return;
          var result = $scope.beforechange();
          if(result){
          $scope.data = !$scope.data;
           }
        }

      },
      require : 'ngModel',
      template :  '<div class="slideThree">'
                  +   '<input type="checkbox" ng-model="data" ng-disabled="disabled()" ng-change="test()">'
                  +   '<label ng-click="toggle()" ng-transclude></label>'
                  +'</div>',
      link : function(scope,iElement,iAttrs){
        scope.$watch('data',function(newValue,oldValue,scope){
          console.log('')
          if(newValue != oldValue){
            scope.change();
          }
        })
      }
    }
  })

app.directive('cTable', [
    function() {
      return {
        restrict: 'E,A',
        replace: true,
        scope: {
          table: '=ngModel',
          selectAll: '&'
        },
        template: '<table><thead>'
                  + '<tr>'
                  +     '<td ng-repeat="item in table.columns">'
                  +         '<div ng-switch="item.type">'
                  +             '<div ng-switch-when="check" ng-if="!table.disabledAllCheck && selectAll">'
                  +                 '<span class="ui-checkbox">'
                  +                     '<input type="checkbox" id="selectAll" name="selectAll" class="ui-checkbox-normal" ng-click="selectAll({eve: $event})">'
                  +                     '<label for="selectAll" class="ui-checkbox-simulation"></label>'
                  +                 '</span>'
                  +                 '<label for="selectAll" class="ui-label" ng-cloak>{{item.name}}</label>'
                  +             '</div>'
                  +             '<div ng-switch-when="check" ng-if="table.disabledAllCheck">'
                  +                 '<span class="ui-checkbox">'
                  +                     '<input type="checkbox" id="selectAll" name="selectAll" class="ui-checkbox-normal" disabled="">'
                  +                     '<label for="selectAll" class="ui-checkbox-simulation f-not-allowed"></label>'
                  +                 '</span>'
                  +                 '<label for="selectAll" class="ui-label" ng-cloak>{{item.name}}</label>'
                  +             '</div>'
                  +             '<div ng-switch-when="normal" ng-cloak>{{item.name}}'
                  +             '</div>'
                  +             '<div ng-switch-when="link" ng-cloak>{{item.name}}'
                  +             '</div>'
                  +             '<div ng-switch-when="operation" ng-cloak>{{item.name}}'
                  +             '</div>'
                  +             '<div ng-switch-when="switch" ng-cloak>{{item.name}}'
                  +             '</div>'
                  +         '</div>'
                  +     '</td>'
                  + '</tr>'
                  + '</thead>'
                  + '<tbody class="ui-table-tbody">'
                  + '<tr ng-repeat="item in table.data">'
                  +     '<td ng-repeat="col in table.columns">'
                  +         '<div ng-switch="col.type">'
                  +             '<div ng-switch-when="check" ng-if="!item.disabledCheck">'
                  +                 '<span class="ui-checkbox">'
                  +                     '<input type="checkbox" id="{{item.pendId}}" name="checkbox" class="ui-checkbox-normal" ng-click="checked(item.pendId)" value="{{item.pendId}}">'
                  +                     '<label for="{{item.pendId}}" class="ui-checkbox-simulation"></label>'
                  +                 '</span>'
                  +             '</div>'
                  +             '<div ng-switch-when="check" ng-if="item.disabledCheck">'
                  +                 '<span class="ui-checkbox">'
                  +                     '<input type="checkbox" id="{{item.pendId}}" name="checkbox" class="ui-checkbox-normal" disabled="">'
                  +                     '<label for="{{item.pendId}}" class="ui-checkbox-simulation f-not-allowed"></label>'
                  +                 '</span>'
                  +             '</div>'
                  +             '<div ng-switch-when="normal" class="{{col.cellClass}}" ng-cloak>{{col.fieldParent? item[col.fieldParent][col.field] : item[col.field]}}'
                  +             '</div>'
                  +             '<div ng-switch-when="link" class="{{col.cellClass}}" ng-cloak><a href="javascript:;" ng-click="col.handler($event, item)">{{col.fieldParent? item[col.fieldParent][col.field] : item[col.field]}}</a>'
                  +             '</div>'
                  +             '<div ng-switch-when="operation" ng-if="item[col.showOperationCondition]">'
                  +                 '<span ng-repeat="op in col.operations"><span class="ui-divider" ng-if="$index!=0"></span><span>'
                  +                     '<a href="javascript:;" ng-click="op.handler($event,item)" class="{{col.cellClass}}" >{{op.name}}</a>'
                  +                 '</span>'
                  +                 '</span>'
                  +             '</div>'
                  +             '<div ng-switch-when="switch">'
                  // +                 '<input class="mui-switch" type="checkbox" ng-model="item[col.field]" ng-change="col.handler.onChange(item)" ng-disabled="item[col.switchDisableCondition]">'
                  // +                '<div class="slideThree">'
                  // +                  '<input type="checkbox" value="None" id="slideThree" name="check" checked="">'
                  // +                  '<label for="slideThree"></label>'
                  // +                 '</div>'
                  +               '<mycheckbox ng-model="item[col.field]" change="col.handler.onChange(item)" disabled="item[col.switchDisableCondition]" beforechange="col.handler.beforeChange(item)"></mycheckbox>'
                  +             '</div>'
                  +         '</div>'
                  +     '</td>'
                  + '</tr>'
                  + '</tbody>'
                  + '</table>',
        link: function(scope, el, attr) {
        },
        controller : function(){

        }
      };
    }
  ]);

var vm = {
            currentPage: 1,
            pageSize: 10,
            urlCode: getUrlParam('code'),
            tableData: {
                columns: [
                    {
                        'field' : 'assetPoolState',
                        'name' : '自定义的开关',
                        'type' : 'switch',
                        'handler' : {
                            // 'onChange' : function(item){
                            //     console.log(item);
                            //     var assetPoolState = item.assetPoolState ? 'ON' : 'OFF'
                            //     _changeCirculateBuyState(item , assetPoolState);
                            // }
                            'onChange' : function(item){
                                console.log(item);
                                var assetPoolState = item.assetPoolState ? 'ON' : 'OFF'
                                _changeCirculateBuyState(item , assetPoolState);
                            }
                        },
                        'switchDisableCondition' : 'switchDisable'
                    }
                ],
                data: []
            }
        };
_sendAjax('/XXX/XXX', 'get', params, function(data) {
                if (!data) {
                    return ShowMessage("对不起您没有权限");
                }

                if (data.success && data.results && data.results._defaultResult && data.results._defaultResult.length) {
                    var items = [];
                    angular.forEach(data.results._defaultResult, function(value,index){
                        value.switchDisable = (value.status === '已购买' ? false : true) ;
                        value.assetPoolState = (value.assetPoolState == 'ON' ? true : false);
                        items.push(value);
                    });

                    vm.tableData.data = items;
                    _pageConfig.pno = data.results.currentPage;
                    _pageConfig.totalRecords = data.results.totalData;
                    tablePager.init(_pageConfig);

                } else {
                    if (!data.success) {
                        return ShowMessage(data.message);
                    }
                    vm.tableData.data = [];
                    _pageConfig.pno = 0;
                    _pageConfig.totalRecords = 0;
                    tablePager.init(_pageConfig);
                }
            });

参考的代码

https://github.com/angularify/angular-semantic-ui/blob/master/src/checkbox/checkbox.js

'use strict';

angular.module('angularify.semantic.checkbox', [])

.directive('checkbox', function() {

return {

restrict: 'E',

replace: true,

transclude: true,

scope: {

checked: '&?',

disabled: '&?',

ngModel: '=ngModel'

},

controller: function() {

var vm = this;

// TODO: assert this is usefull ?

// if(angular.isUndefined(vm.ngModel)) { vm.ngModel = !!vm.ngModel; }

if(angular.isFunction(vm.checked)) { vm.ngModel = !!vm.checked(); }

vm.toggle = function() {

if(angular.isFunction(vm.disabled) && vm.disabled()) return;

vm.ngModel = !vm.ngModel;

}

},

controllerAs: 'vm',

bindToController: true,

require: 'ngModel',

template: '<div class="ui checkbox">' +

'<input type="checkbox" ng-model="vm.ngModel" ng-disabled="vm.disabled()"/>' +

'<label ng-click="vm.toggle()" ng-transclude></label>' +

'</div>',

link: function() { }

};

});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,463评论 25 707
  • 转载请声明 原文链接地址 关注公众号获取更多资讯 第一部分 HTML 第一章 职业规划和前景 职业方向规划定位...
    程序员poetry阅读 16,513评论 32 459
  • 凝炼的雪,唤作人体。 超然的露,堪称艺术。 捧雪人——非阳春白雪。 艺术像——谓人体艺术。 色即是空,空即是色。 ...
    王崴斯阅读 215评论 0 3
  • 豆同学住院已经10天了,随着他的腹痛完全消失,人变得有精神了;同时也越来越有胃口吃饭菜,只是吃的饭菜还需要避免油腻...
    郑海玲Irene阅读 423评论 1 2
  • 洋葱生长记 三年级三班 王梓晗 前几天,妈妈买了一些洋葱,放在墙角,由于一...
    王王梓晗阅读 263评论 0 6