Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit 2e157d2

Browse files
author
Robert Messerle
committed
fix(autocomplete): item templates now handle child bindings in the correct scope
I had to avoid using transclusion and instead, handle the template manually to accomplish this. Closes #2065
1 parent ebca76d commit 2e157d2

File tree

2 files changed

+59
-55
lines changed

2 files changed

+59
-55
lines changed

src/components/autocomplete/js/autocompleteDirective.js

Lines changed: 58 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141

4242
function MdAutocomplete () {
4343
return {
44-
transclude: true,
4544
controller: 'MdAutocompleteCtrl',
4645
controllerAs: '$mdAutocompleteCtrl',
4746
link: link,
@@ -62,75 +61,79 @@
6261
floatingLabel: '@?mdFloatingLabel',
6362
autoselect: '=?mdAutoselect'
6463
},
65-
template: '\
66-
<md-autocomplete-wrap role="listbox">\
67-
<md-input-container ng-if="floatingLabel">\
68-
<label>{{floatingLabel}}</label>\
64+
template: function (element, attr) {
65+
attr.$mdAutocompleteTemplate = element.html();
66+
return '\
67+
<md-autocomplete-wrap role="listbox">\
68+
<md-input-container ng-if="floatingLabel">\
69+
<label>{{floatingLabel}}</label>\
70+
<input type="text"\
71+
id="fl-input-{{$mdAutocompleteCtrl.id}}"\
72+
name="{{name}}"\
73+
autocomplete="off"\
74+
ng-disabled="isDisabled"\
75+
ng-model="$mdAutocompleteCtrl.scope.searchText"\
76+
ng-keydown="$mdAutocompleteCtrl.keydown($event)"\
77+
ng-blur="$mdAutocompleteCtrl.blur()"\
78+
aria-owns="ul-{{$mdAutocompleteCtrl.id}}"\
79+
aria-label="{{floatingLabel}}"\
80+
aria-autocomplete="list"\
81+
aria-haspopup="true"\
82+
aria-activedescendant=""\
83+
aria-expanded="{{!$mdAutocompleteCtrl.hidden}}"/>\
84+
\
85+
</md-input-container>\
6986
<input type="text"\
70-
id="fl-input-{{$mdAutocompleteCtrl.id}}"\
87+
id="input-{{$mdAutocompleteCtrl.id}}"\
7188
name="{{name}}"\
89+
ng-if="!floatingLabel"\
7290
autocomplete="off"\
7391
ng-disabled="isDisabled"\
7492
ng-model="$mdAutocompleteCtrl.scope.searchText"\
7593
ng-keydown="$mdAutocompleteCtrl.keydown($event)"\
7694
ng-blur="$mdAutocompleteCtrl.blur()"\
95+
placeholder="{{placeholder}}"\
7796
aria-owns="ul-{{$mdAutocompleteCtrl.id}}"\
78-
aria-label="{{floatingLabel}}"\
97+
aria-label="{{placeholder}}"\
7998
aria-autocomplete="list"\
8099
aria-haspopup="true"\
81100
aria-activedescendant=""\
82101
aria-expanded="{{!$mdAutocompleteCtrl.hidden}}"/>\
83-
\
84-
</md-input-container>\
85-
<input type="text"\
86-
id="input-{{$mdAutocompleteCtrl.id}}"\
87-
name="{{name}}"\
88-
ng-if="!floatingLabel"\
89-
autocomplete="off"\
90-
ng-disabled="isDisabled"\
91-
ng-model="$mdAutocompleteCtrl.scope.searchText"\
92-
ng-keydown="$mdAutocompleteCtrl.keydown($event)"\
93-
ng-blur="$mdAutocompleteCtrl.blur()"\
94-
placeholder="{{placeholder}}"\
95-
aria-owns="ul-{{$mdAutocompleteCtrl.id}}"\
96-
aria-label="{{placeholder}}"\
97-
aria-autocomplete="list"\
98-
aria-haspopup="true"\
99-
aria-activedescendant=""\
100-
aria-expanded="{{!$mdAutocompleteCtrl.hidden}}"/>\
101-
<button\
102-
type="button"\
103-
ng-if="$mdAutocompleteCtrl.scope.searchText && !isDisabled"\
104-
ng-click="$mdAutocompleteCtrl.clear()">\
105-
<md-icon md-svg-icon="cancel"></md-icon>\
106-
<span class="visually-hidden">Clear</span>\
107-
</button>\
108-
<md-progress-linear\
109-
ng-if="$mdAutocompleteCtrl.loading"\
110-
md-mode="indeterminate"></md-progress-linear>\
111-
<ul role="presentation"\
112-
id="ul-{{$mdAutocompleteCtrl.id}}"\
113-
ng-mouseenter="$mdAutocompleteCtrl.listEnter()"\
114-
ng-mouseleave="$mdAutocompleteCtrl.listLeave()"\
115-
ng-mouseup="$mdAutocompleteCtrl.mouseUp()">\
116-
<li ng-repeat="(index, item) in $mdAutocompleteCtrl.matches"\
117-
ng-class="{ selected: index === $mdAutocompleteCtrl.index }"\
118-
ng-show="$mdAutocompleteCtrl.scope.searchText && !$mdAutocompleteCtrl.hidden"\
119-
ng-click="$mdAutocompleteCtrl.select(index)"\
120-
ng-transclude\
121-
md-autocomplete-list-item="$mdAutocompleteCtrl.itemName">\
122-
</li>\
123-
</ul>\
124-
</md-autocomplete-wrap>\
125-
<aria-status\
126-
class="visually-hidden"\
127-
role="status"\
128-
aria-live="assertive">\
129-
<p ng-repeat="message in $mdAutocompleteCtrl.messages">{{message.display}}</p>\
130-
</aria-status>'
102+
<button\
103+
type="button"\
104+
ng-if="$mdAutocompleteCtrl.scope.searchText && !isDisabled"\
105+
ng-click="$mdAutocompleteCtrl.clear()">\
106+
<md-icon md-svg-icon="cancel"></md-icon>\
107+
<span class="visually-hidden">Clear</span>\
108+
</button>\
109+
<md-progress-linear\
110+
ng-if="$mdAutocompleteCtrl.loading"\
111+
md-mode="indeterminate"></md-progress-linear>\
112+
<ul role="presentation"\
113+
id="ul-{{$mdAutocompleteCtrl.id}}"\
114+
ng-mouseenter="$mdAutocompleteCtrl.listEnter()"\
115+
ng-mouseleave="$mdAutocompleteCtrl.listLeave()"\
116+
ng-mouseup="$mdAutocompleteCtrl.mouseUp()">\
117+
<li ng-repeat="(index, item) in $mdAutocompleteCtrl.matches"\
118+
ng-class="{ selected: index === $mdAutocompleteCtrl.index }"\
119+
ng-show="$mdAutocompleteCtrl.scope.searchText && !$mdAutocompleteCtrl.hidden"\
120+
ng-click="$mdAutocompleteCtrl.select(index)"\
121+
md-autocomplete-list-item-template="contents"\
122+
md-autocomplete-list-item="$mdAutocompleteCtrl.itemName">\
123+
</li>\
124+
</ul>\
125+
</md-autocomplete-wrap>\
126+
<aria-status\
127+
class="visually-hidden"\
128+
role="status"\
129+
aria-live="assertive">\
130+
<p ng-repeat="message in $mdAutocompleteCtrl.messages">{{message.display}}</p>\
131+
</aria-status>';
132+
}
131133
};
132134

133135
function link (scope, element, attr) {
136+
scope.contents = attr.$mdAutocompleteTemplate;
134137
angular.forEach(scope.$$isolateBindings, function (binding, key) {
135138
if (binding.optional && angular.isUndefined(scope[key])) {
136139
scope[key] = attr.hasOwnProperty(attr.$normalize(binding.attrName));

src/components/autocomplete/js/listItemDirective.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
var newScope = ctrl.parent.$new(false, ctrl.parent),
1616
itemName = ctrl.scope.$eval(attr.mdAutocompleteListItem);
1717
newScope[itemName] = scope.item;
18+
element.html(ctrl.scope.$eval(attr.mdAutocompleteListItemTemplate));
1819
$compile(element.contents())(newScope);
1920
element.attr({ 'role': 'option', 'id': 'item_' + $mdUtil.nextUid() });
2021
}

0 commit comments

Comments
 (0)