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

Commit b4c0a86

Browse files
committed
fix(select): change placeholder computation to be handled internally
closes #1666
1 parent 9e0ca44 commit b4c0a86

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

src/components/select/select.js

+32-21
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,9 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile,
7272

7373
return {
7474
restrict: 'E',
75-
require: '?ngModel',
76-
compile: compile
75+
require: ['mdSelect', '?ngModel'],
76+
compile: compile,
77+
controller: function() { } // empty placeholder controller to be initialized in link
7778
};
7879

7980
function compile(element, attr) {
@@ -86,7 +87,6 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile,
8687
}
8788
labelEl.append('<span class="md-select-icon" aria-hidden="true"></span>');
8889
labelEl.addClass('md-select-label');
89-
labelEl.addClass(intStart + attr.ngModel + ' !== undefined ? \'\' : \'md-placeholder\'' + intEnd);
9090
labelEl.attr('id', 'select_label_' + $mdUtil.nextUid());
9191

9292
// There's got to be an md-content inside. If there's not one, let's add it.
@@ -117,11 +117,26 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile,
117117

118118
$mdTheming(element);
119119

120-
return function postLink(scope, element, attr, ngModel) {
120+
return function postLink(scope, element, attr, ctrls) {
121121
var isOpen;
122+
123+
var mdSelectCtrl = ctrls[0];
124+
var ngModel = ctrls[1];
122125
var labelEl = element.find('md-select-label');
123126
var customLabel = labelEl.text().length !== 0;
124-
if (!customLabel) labelEl = labelEl.children().eq(0);
127+
128+
mdSelectCtrl.setLabelText = function(text) {
129+
if (customLabel) return; // Assume that user is handling it on their own
130+
mdSelectCtrl.setIsPlaceholder(!text);
131+
var newText = text || attr.placeholder;
132+
var target = customLabel ? labelEl : labelEl.children().eq(0);
133+
target.html(newText);
134+
};
135+
136+
mdSelectCtrl.setIsPlaceholder = function(val) {
137+
val ? labelEl.addClass('md-placeholder') : labelEl.removeClass('md-placeholder');
138+
};
139+
125140
setInitialLabelValue();
126141

127142
attr.$observe('disabled', function(disabled) {
@@ -155,30 +170,25 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile,
155170
}
156171
});
157172

173+
158174
// Create a fake select to find out the label value
159175
function setInitialLabelValue() {
160176
if ($parse(attr.ngModel)(scope)) {
161177
var fakeSelectEl = angular.element(selectTemplate.clone()).find('md-select-menu');
162178
fakeSelectEl.data('$ngModelController', ngModel);
179+
fakeSelectEl.data('$mdSelectController', mdSelectCtrl);
163180
var fakeSelectScope = scope.$new();
164181
fakeSelectEl = $compile(fakeSelectEl)(fakeSelectScope);
165182
var fakeSelectCtrl = fakeSelectEl.controller('mdSelectMenu');
166183
fakeSelectScope.$$postDigest(function() {
167184
ngModel.$render();
168-
setLabelText(fakeSelectCtrl.selectedLabels());
169185
fakeSelectEl.scope().$destroy();
170186
});
171187
} else {
172-
setLabelText();
188+
mdSelectCtrl.setLabelText();
173189
}
174190
}
175191

176-
function setLabelText(text) {
177-
if (customLabel) return; // Assume that user is handling it on their own
178-
var newText = text || attr.placeholder;
179-
labelEl.html(newText);
180-
}
181-
182192
function openOnKeypress(e) {
183193
var allowedCodes = [32, 13, 38, 40];
184194
if (allowedCodes.indexOf(e.keyCode) != -1 ) {
@@ -192,29 +202,28 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile,
192202
scope.$evalAsync(function() {
193203
var selectEl = selectTemplate.clone();
194204
selectEl.find('md-select-menu').data('$ngModelController', ngModel);
205+
selectEl.find('md-select-menu').data('$mdSelectController', mdSelectCtrl);
195206
isOpen = true;
196207
$mdSelect.show({
197208
scope: scope.$new(),
198209
element: selectEl,
199210
target: element[0],
200211
hasBackdrop: true,
201212
loadingAsync: attr.mdOnOpen ? scope.$eval(attr.mdOnOpen) : false,
202-
setLabelText: setLabelText
203213
}).then(function(selectedText) {
204214
isOpen = false;
205215
});
206216
});
207217
}
208218
};
209-
210219
}
211220
}
212221

213222
function SelectMenuDirective($parse, $mdUtil, $mdTheming) {
214223

215224
return {
216225
restrict: 'E',
217-
require: ['mdSelectMenu', '?ngModel'],
226+
require: ['mdSelectMenu', '?mdSelect', '?ngModel'],
218227
controller: SelectMenuController,
219228
link: { pre: preLink }
220229
};
@@ -223,12 +232,13 @@ function SelectMenuDirective($parse, $mdUtil, $mdTheming) {
223232
// its child options run postLink.
224233
function preLink(scope, element, attr, ctrls) {
225234
var selectCtrl = ctrls[0];
226-
var ngModel = ctrls[1];
235+
var mdSelect = ctrls[1];
236+
var ngModel = ctrls[2];
227237

228238
$mdTheming(element);
229239
element.on('click', clickListener);
230240
element.on('keypress', keyListener);
231-
if (ngModel) selectCtrl.init(ngModel);
241+
if (ngModel) selectCtrl.init(ngModel, mdSelect);
232242
configureAria();
233243

234244
function configureAria() {
@@ -283,8 +293,9 @@ function SelectMenuDirective($parse, $mdUtil, $mdTheming) {
283293
self.options = {};
284294

285295

286-
self.init = function(ngModel) {
296+
self.init = function(ngModel, mdSelect) {
287297
self.ngModel = ngModel;
298+
self.mdSelect = mdSelect;
288299

289300
// Allow users to provide `ng-model="foo" ng-model-options="{trackBy: 'foo.id'}"` so
290301
// that we can properly compare objects set on the model to the available options
@@ -399,11 +410,13 @@ function SelectMenuDirective($parse, $mdUtil, $mdTheming) {
399410
newSelectedHashes.forEach(function(hashKey, i) {
400411
self.select(hashKey, newSelectedValues[i]);
401412
});
413+
self.mdSelect && self.mdSelect.setLabelText(self.selectedLabels());
402414
}
403415
function renderSingular() {
404416
var value = self.ngModel.$viewValue || self.ngModel.$modelValue;
405417
Object.keys(self.selected).forEach(self.deselect);
406418
self.select( self.hashGetter(value), value );
419+
self.mdSelect && self.mdSelect.setLabelText(self.selectedLabels());
407420
}
408421
}
409422

@@ -666,8 +679,6 @@ function SelectProvider($$interimElementProvider) {
666679
delete opts.disableTarget;
667680
}
668681

669-
opts.setLabelText && opts.setLabelText(opts.selectEl.controller('mdSelectMenu').selectedLabels());
670-
671682
return $mdUtil.transitionEndPromise(element).then(function() {
672683
element.remove();
673684
opts.backdrop && opts.backdrop.remove();

0 commit comments

Comments
 (0)