|
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