|
21 | 21 | /** |
22 | 22 | * Type: string |
23 | 23 | * Default: '' |
24 | | - * Description: Size of the toggle. Possible values are btn-lg, btn-sm, btn-xs. |
| 24 | + * Description: Size of the toggle. |
| 25 | + * Possible values are btn-lg, btn-sm, btn-xs. |
25 | 26 | */ |
26 | 27 | size: '', |
27 | 28 | /** |
28 | 29 | * Type: string |
29 | 30 | * Default: "btn-primary" |
30 | | - * Description: Style of the on toggle. Possible values are btn-default, btn-primary, btn-success, btn-info, btn-warning, btn-danger |
| 31 | + * Description: Style of the on toggle. |
| 32 | + * Possible values are btn-default, btn-primary, btn-success, btn-info, btn-warning, btn-danger |
31 | 33 | */ |
32 | 34 | onstyle: 'btn-primary', |
33 | 35 | /** |
34 | 36 | * Type: string |
35 | 37 | * Default: "btn-default" |
36 | | - * Description: Style of the off toggle. Possible values are btn-default, btn-primary,btn- success, btn-info, btn-warning, btn-danger |
| 38 | + * Description: Style of the off toggle. |
| 39 | + * Possible values are btn-default, btn-primary,btn- success, btn-info, btn-warning, btn-danger |
37 | 40 | */ |
38 | 41 | offstyle: 'btn-default', |
39 | 42 | /** |
40 | 43 | * Type: string |
41 | 44 | * Default: '' |
42 | | - * Description: Appends the value to the class attribute of the toggle. This can be used to apply custom styles. Refer to Custom Styles for reference. |
| 45 | + * Description: Appends the value to the class attribute of the toggle. |
| 46 | + * This can be used to apply custom styles. Refer to Custom Styles for reference. |
43 | 47 | */ |
44 | 48 | style: '' |
45 | 49 | }) |
46 | 50 |
|
47 | 51 | .controller('ToggleController', |
48 | | - ['$scope', '$attrs', '$interpolate', '$log', 'toggleConfig', '$toggleSuppressError', |
49 | | - function ($scope, $attrs, $interpolate, $log, toggleConfig, $toggleSuppressError) { |
50 | | - var self = this, |
51 | | - ngModelCtrl = {$setViewValue: angular.noop}; |
52 | | - |
53 | | - // Configuration attributes |
54 | | - angular.forEach(['on', 'off', 'size', 'onstyle', 'offstyle', 'style'], function (key, index) { |
55 | | - //$log.info(key + ':' + $attrs[key]); |
56 | | - self[key] = angular.isDefined($attrs[key]) ? (index < 6 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : toggleConfig[key]; |
57 | | - //$log.info(key + ':' + self[key]); |
58 | | - }); |
59 | | - |
60 | | - this.init = function (ngModelCtrl_) { |
61 | | - ngModelCtrl = ngModelCtrl_; |
62 | | - |
63 | | - ngModelCtrl.$render = function () { |
64 | | - self.render(); |
65 | | - }; |
66 | | - |
67 | | - ngModelCtrl.$viewChangeListeners.push(function () { |
68 | | - $scope.$eval($attrs.ngChange); |
| 52 | + ['$scope', '$attrs', '$interpolate', '$log', 'toggleConfig', '$toggleSuppressError', |
| 53 | + function ($scope, $attrs, $interpolate, $log, toggleConfig, $toggleSuppressError) { |
| 54 | + var self = this, |
| 55 | + ngModelCtrl = {$setViewValue: angular.noop}; |
| 56 | + |
| 57 | + // Configuration attributes |
| 58 | + angular.forEach(['on', 'off', 'size', 'onstyle', 'offstyle', 'style'], function (key, index) { |
| 59 | + self[key] = angular.isDefined($attrs[key]) ? |
| 60 | + (index < 6 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : |
| 61 | + toggleConfig[key]; |
69 | 62 | }); |
70 | 63 |
|
71 | | - var labels = self.element.find('label'); |
72 | | - angular.element(labels[0]).html(self.on); |
73 | | - angular.element(labels[1]).html(self.off); |
74 | | - var spans = self.element.find('span'); |
75 | | - var wrapperComputedWidth = self.width || Math.max(labels[0].offsetWidth, labels[1].offsetWidth) + (spans[0].offsetWidth / 2); |
76 | | - var wrapperComputedHeight = self.height || Math.max(labels[0].offsetHeight, labels[1].offsetHeight); |
| 64 | + this.init = function (ngModelCtrl_) { |
| 65 | + ngModelCtrl = ngModelCtrl_; |
77 | 66 |
|
78 | | - var divs = self.element.find('div'); |
79 | | - var wrapperWidth = divs[0].offsetWidth; |
80 | | - var wrapperHeight = divs[1].offsetHeight; |
| 67 | + self.computeStyle(); |
81 | 68 |
|
82 | | - $scope.wrapperStyle = {}; |
83 | | - if (wrapperWidth < wrapperComputedWidth) { |
84 | | - $scope.wrapperStyle.width = wrapperComputedWidth + 'px'; |
85 | | - } |
| 69 | + ngModelCtrl.$render = function () { |
| 70 | + self.toggle(); |
| 71 | + }; |
86 | 72 |
|
87 | | - if (wrapperHeight < wrapperComputedHeight && self.size != 'btn-xs' && self.size != 'btn-sm') { |
88 | | - $scope.wrapperStyle.height = wrapperComputedHeight + 'px'; |
89 | | - } |
90 | | - $scope.onClass = [self.onstyle, self.size, 'toggle-on']; |
91 | | - $scope.offClass = [self.offstyle, self.size, 'toggle-off']; |
92 | | - $scope.handleClass = [self.size, 'toggle-handle']; |
93 | | - }; |
| 73 | + ngModelCtrl.$viewChangeListeners.push(function () { |
| 74 | + $scope.$eval($attrs.ngChange); |
| 75 | + }); |
| 76 | + }; |
94 | 77 |
|
95 | | - this.render = function () { |
96 | | - if (angular.isDefined(ngModelCtrl.$viewValue)) { |
97 | | - this.isOn = ngModelCtrl.$viewValue; |
98 | | - } else { |
99 | | - this.isOn = false; |
100 | | - } |
101 | | - if (this.isOn) { |
102 | | - $scope.wrapperClass = [self.onstyle, self.size, self.style]; |
103 | | - } else { |
104 | | - $scope.wrapperClass = [self.offstyle, 'off ', self.size, self.style]; |
105 | | - } |
106 | | - }; |
| 78 | + this.computeStyle = function () { |
| 79 | + var labels = self.element.find('label'); |
| 80 | + angular.element(labels[0]).html(self.on); |
| 81 | + angular.element(labels[1]).html(self.off); |
| 82 | + var spans = self.element.find('span'); |
| 83 | + var wrapperComputedWidth = self.width || Math.max(labels[0].offsetWidth, labels[1].offsetWidth) + |
| 84 | + (spans[0].offsetWidth / 2); |
| 85 | + var wrapperComputedHeight = self.height || Math.max(labels[0].offsetHeight, labels[1].offsetHeight); |
| 86 | + |
| 87 | + var divs = self.element.find('div'); |
| 88 | + var wrapperWidth = divs[0].offsetWidth; |
| 89 | + var wrapperHeight = divs[1].offsetHeight; |
| 90 | + |
| 91 | + $scope.wrapperStyle = {}; |
| 92 | + if (wrapperWidth < wrapperComputedWidth) { |
| 93 | + $scope.wrapperStyle.width = wrapperComputedWidth + 'px'; |
| 94 | + } else { |
| 95 | + $scope.wrapperStyle.width = wrapperWidth + 'px'; |
| 96 | + } |
| 97 | + |
| 98 | + if (wrapperHeight < wrapperComputedHeight && self.size !== 'btn-xs' && self.size !== 'btn-sm') { |
| 99 | + $scope.wrapperStyle.height = wrapperComputedHeight + 'px'; |
| 100 | + } else { |
| 101 | + $scope.wrapperStyle.height = wrapperHeight + 'px'; |
| 102 | + } |
| 103 | + |
| 104 | + $scope.onClass = [self.onstyle, self.size, 'toggle-on']; |
| 105 | + $scope.offClass = [self.offstyle, self.size, 'toggle-off']; |
| 106 | + $scope.handleClass = [self.size, 'toggle-handle']; |
| 107 | + }; |
107 | 108 |
|
108 | | - $scope.onSwitch = function (evt) { |
109 | | - ngModelCtrl.$setViewValue(!ngModelCtrl.$viewValue); |
110 | | - ngModelCtrl.$render(); |
111 | | - }; |
| 109 | + this.toggle = function () { |
| 110 | + if (angular.isDefined(ngModelCtrl.$viewValue)) { |
| 111 | + this.isOn = ngModelCtrl.$viewValue; |
| 112 | + } else { |
| 113 | + this.isOn = false; |
| 114 | + } |
| 115 | + if (this.isOn) { |
| 116 | + $scope.wrapperClass = [self.onstyle, self.size, self.style]; |
| 117 | + } else { |
| 118 | + $scope.wrapperClass = [self.offstyle, 'off ', self.size, self.style]; |
| 119 | + } |
| 120 | + }; |
112 | 121 |
|
113 | | - // Watchable date attributes |
114 | | - angular.forEach(['ngModel'], function (key) { |
115 | | - var watch = $scope.$parent.$watch($attrs[key], function (value) { |
| 122 | + $scope.onSwitch = function (evt) { |
| 123 | + ngModelCtrl.$setViewValue(!ngModelCtrl.$viewValue); |
116 | 124 | ngModelCtrl.$render(); |
| 125 | + }; |
| 126 | + |
| 127 | + // Watchable date attributes |
| 128 | + angular.forEach(['ngModel'], function (key) { |
| 129 | + var watch = $scope.$parent.$watch($attrs[key], function (value) { |
| 130 | + ngModelCtrl.$render(); |
| 131 | + }); |
| 132 | + $scope.$parent.$on('$destroy', function () { |
| 133 | + watch(); |
| 134 | + }); |
117 | 135 | }); |
118 | | - $scope.$parent.$on('$destroy', function () { |
119 | | - watch(); |
| 136 | + |
| 137 | + angular.forEach(['on', 'off', 'size', 'onstyle', 'offstyle', 'style'], function (key) { |
| 138 | + $attrs.$observe(key, function (val) { |
| 139 | + if (self[key] !== val) { |
| 140 | + self[key] = val; |
| 141 | + self.computeStyle(); |
| 142 | + } |
| 143 | + }); |
120 | 144 | }); |
121 | | - }); |
122 | | - }]) |
| 145 | + }]) |
123 | 146 |
|
124 | 147 | .directive('toggle', function () { |
125 | | - return { |
126 | | - restrict: 'E', |
127 | | - transclude: true, |
128 | | - template: '<div class="toggle btn" ng-class="wrapperClass" ng-style="::wrapperStyle" ng-click="onSwitch()"><div class="toggle-group"><label class="btn" ng-class="::onClass"></label><label class="btn active" ng-class="::offClass"></label><span class="btn btn-default" ng-class="::handleClass"></span></div></div>', |
129 | | - scope: { |
130 | | - bindModel: '=ngModel' |
131 | | - }, |
132 | | - require: ['toggle', 'ngModel'], |
133 | | - controller: 'ToggleController', |
134 | | - controllerAs: 'toggle', |
135 | | - link: function (scope, element, attrs, ctrls) { |
136 | | - var toggleCtrl = ctrls[0], ngModelCtrl = ctrls[1]; |
137 | | - toggleCtrl.element = element; |
138 | | - toggleCtrl.init(ngModelCtrl); |
139 | | - } |
140 | | - }; |
141 | | - } |
142 | | - ); |
| 148 | + return { |
| 149 | + restrict: 'E', |
| 150 | + transclude: true, |
| 151 | + template: '<div class="toggle btn" ng-class="wrapperClass" ng-style="wrapperStyle" ng-click="onSwitch()">' + |
| 152 | + '<div class="toggle-group">' + |
| 153 | + '<label class="btn" ng-class="onClass"></label>' + |
| 154 | + '<label class="btn active" ng-class="offClass"></label>' + |
| 155 | + '<span class="btn btn-default" ng-class="handleClass"></span>' + |
| 156 | + '</div>' + |
| 157 | + '</div>', |
| 158 | + scope: { |
| 159 | + bindModel: '=ngModel' |
| 160 | + }, |
| 161 | + require: ['toggle', 'ngModel'], |
| 162 | + controller: 'ToggleController', |
| 163 | + controllerAs: 'toggle', |
| 164 | + link: function (scope, element, attrs, ctrls) { |
| 165 | + var toggleCtrl = ctrls[0], ngModelCtrl = ctrls[1]; |
| 166 | + toggleCtrl.element = element; |
| 167 | + toggleCtrl.init(ngModelCtrl); |
| 168 | + } |
| 169 | + }; |
| 170 | + } |
| 171 | + ); |
143 | 172 | })(); |
0 commit comments