|
4 | 4 | .module('material.components.autocomplete') |
5 | 5 | .controller('MdAutocompleteCtrl', MdAutocompleteCtrl); |
6 | 6 |
|
7 | | - function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $timeout) { |
| 7 | + function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $timeout, $rootElement, $mdTheming) { |
8 | 8 |
|
9 | 9 | //-- private variables |
10 | 10 |
|
|
54 | 54 | $timeout(function () { |
55 | 55 | gatherElements(); |
56 | 56 | focusElement(); |
| 57 | + moveDropdown(); |
57 | 58 | }); |
58 | 59 | } |
59 | 60 |
|
| 61 | + function getNearestContentElement () { |
| 62 | + var current = $element.parent()[0]; |
| 63 | + while (current && current !== $rootElement[0] && current !== document.body) { |
| 64 | + if (current.tagName && current.tagName.toLowerCase() === 'md-content') break; |
| 65 | + current = current.parentNode; |
| 66 | + } |
| 67 | + return current; |
| 68 | + } |
| 69 | + |
| 70 | + function positionDropdown () { |
| 71 | + elements.$.ul.css({ |
| 72 | + left: $element.prop('offsetLeft') + 'px', |
| 73 | + top: ($element.prop('offsetTop') + $element.prop('offsetHeight')) + 'px', |
| 74 | + width: $element.prop('offsetWidth') + 'px' |
| 75 | + }); |
| 76 | + } |
| 77 | + |
| 78 | + function moveDropdown () { |
| 79 | + if (!elements.$.root.length) return; |
| 80 | + $mdTheming(elements.$.ul); |
| 81 | + elements.$.ul.detach(); |
| 82 | + elements.$.root.append(elements.$.ul); |
| 83 | + } |
| 84 | + |
60 | 85 | function focusElement () { |
61 | 86 | if ($scope.autofocus) elements.input.focus(); |
62 | 87 | } |
|
74 | 99 | elements = { |
75 | 100 | main: $element[0], |
76 | 101 | ul: $element[0].getElementsByTagName('ul')[0], |
77 | | - input: $element[0].getElementsByTagName('input')[0] |
| 102 | + input: $element[0].getElementsByTagName('input')[0], |
| 103 | + root: getNearestContentElement() |
78 | 104 | }; |
| 105 | + elements.$ = getAngularElements(elements); |
| 106 | + } |
| 107 | + |
| 108 | + function getAngularElements (elements) { |
| 109 | + var obj = {}; |
| 110 | + for (var key in elements) { |
| 111 | + obj[key] = angular.element(elements[key]); |
| 112 | + } |
| 113 | + return obj; |
79 | 114 | } |
80 | 115 |
|
81 | 116 | //-- event/change handlers |
|
130 | 165 | self.loading = false; |
131 | 166 | self.matches = []; |
132 | 167 | self.hidden = shouldHide(); |
| 168 | + positionDropdown(); |
133 | 169 | updateMessages(); |
134 | 170 | } else { |
135 | 171 | handleQuery(); |
|
0 commit comments