|
79 | 79 | // Define our open/close functions
|
80 | 80 | // Note: Used by fabTrigger and fabActions directives
|
81 | 81 | vm.open = function() {
|
82 |
| - $scope.$apply('vm.isOpen = true'); |
| 82 | + // Async eval to avoid conflicts with existing digest loops |
| 83 | + $scope.$evalAsync("vm.isOpen = true"); |
83 | 84 | };
|
84 | 85 |
|
85 | 86 | vm.close = function() {
|
86 |
| - $scope.$apply('vm.isOpen = false'); |
| 87 | + // Async eval to avoid conflicts with existing digest loops |
| 88 | + // Only close if we do not currently have mouse focus (since child elements can call this) |
| 89 | + !vm.moused && $scope.$evalAsync("vm.isOpen = false"); |
| 90 | + }; |
| 91 | + |
| 92 | + vm.mouseenter = function() { |
| 93 | + vm.moused = true; |
| 94 | + vm.open(); |
| 95 | + }; |
| 96 | + |
| 97 | + vm.mouseleave = function() { |
| 98 | + vm.moused = false; |
| 99 | + vm.close(); |
87 | 100 | };
|
88 | 101 |
|
89 | 102 | setupDefaults();
|
|
101 | 114 |
|
102 | 115 | // Setup our event listeners
|
103 | 116 | function setupListeners() {
|
104 |
| - $element.on('mouseenter', vm.open); |
105 |
| - $element.on('mouseleave', vm.close); |
| 117 | + $element.on('mouseenter', vm.mouseenter); |
| 118 | + $element.on('mouseleave', vm.mouseleave); |
106 | 119 | }
|
107 | 120 |
|
108 | 121 | // Setup our watchers
|
|
142 | 155 | angular.forEach(items, function(item, index) {
|
143 | 156 | var styles = item.style;
|
144 | 157 |
|
145 |
| - styles.transform = ''; |
| 158 | + styles.transform = styles.webkitTransform = ''; |
146 | 159 | styles.transitionDelay = '';
|
147 | 160 | styles.opacity = 1;
|
148 | 161 |
|
149 | 162 | // Make the items closest to the trigger have the highest z-index
|
150 |
| - item.style.zIndex = (items.length - index) + startZIndex; |
| 163 | + styles.zIndex = (items.length - index) + startZIndex; |
151 | 164 | });
|
152 | 165 |
|
153 | 166 | // If the control is closed, hide the items behind the trigger
|
154 | 167 | if (!ctrl.isOpen) {
|
155 | 168 | angular.forEach(items, function(item, index) {
|
156 | 169 | var newPosition, axis;
|
| 170 | + var styles = item.style; |
157 | 171 |
|
158 | 172 | switch (ctrl.direction) {
|
159 | 173 | case 'up':
|
|
174 | 188 | break;
|
175 | 189 | }
|
176 | 190 |
|
177 |
| - item.style.transform = 'translate' + axis + '(' + newPosition + 'px)'; |
| 191 | + var newTranslate = 'translate' + axis + '(' + newPosition + 'px)'; |
| 192 | + |
| 193 | + styles.transform = styles.webkitTransform = newTranslate; |
178 | 194 | });
|
179 | 195 | }
|
180 | 196 | }
|
|
205 | 221 | offsetDelay = index * delay;
|
206 | 222 |
|
207 | 223 | styles.opacity = ctrl.isOpen ? 1 : 0;
|
208 |
| - styles.transform = ctrl.isOpen ? 'scale(1)' : 'scale(0)'; |
| 224 | + styles.transform = styles.webkitTransform = ctrl.isOpen ? 'scale(1)' : 'scale(0)'; |
209 | 225 | styles.transitionDelay = (ctrl.isOpen ? offsetDelay : (items.length - offsetDelay)) + 'ms';
|
210 | 226 | });
|
211 | 227 | }
|
|
0 commit comments