@@ -72,8 +72,9 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile,
72
72
73
73
return {
74
74
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
77
78
} ;
78
79
79
80
function compile ( element , attr ) {
@@ -86,7 +87,6 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile,
86
87
}
87
88
labelEl . append ( '<span class="md-select-icon" aria-hidden="true"></span>' ) ;
88
89
labelEl . addClass ( 'md-select-label' ) ;
89
- labelEl . addClass ( intStart + attr . ngModel + ' !== undefined ? \'\' : \'md-placeholder\'' + intEnd ) ;
90
90
labelEl . attr ( 'id' , 'select_label_' + $mdUtil . nextUid ( ) ) ;
91
91
92
92
// 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,
117
117
118
118
$mdTheming ( element ) ;
119
119
120
- return function postLink ( scope , element , attr , ngModel ) {
120
+ return function postLink ( scope , element , attr , ctrls ) {
121
121
var isOpen ;
122
+
123
+ var mdSelectCtrl = ctrls [ 0 ] ;
124
+ var ngModel = ctrls [ 1 ] ;
122
125
var labelEl = element . find ( 'md-select-label' ) ;
123
126
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
+
125
140
setInitialLabelValue ( ) ;
126
141
127
142
attr . $observe ( 'disabled' , function ( disabled ) {
@@ -155,30 +170,25 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile,
155
170
}
156
171
} ) ;
157
172
173
+
158
174
// Create a fake select to find out the label value
159
175
function setInitialLabelValue ( ) {
160
176
if ( $parse ( attr . ngModel ) ( scope ) ) {
161
177
var fakeSelectEl = angular . element ( selectTemplate . clone ( ) ) . find ( 'md-select-menu' ) ;
162
178
fakeSelectEl . data ( '$ngModelController' , ngModel ) ;
179
+ fakeSelectEl . data ( '$mdSelectController' , mdSelectCtrl ) ;
163
180
var fakeSelectScope = scope . $new ( ) ;
164
181
fakeSelectEl = $compile ( fakeSelectEl ) ( fakeSelectScope ) ;
165
182
var fakeSelectCtrl = fakeSelectEl . controller ( 'mdSelectMenu' ) ;
166
183
fakeSelectScope . $$postDigest ( function ( ) {
167
184
ngModel . $render ( ) ;
168
- setLabelText ( fakeSelectCtrl . selectedLabels ( ) ) ;
169
185
fakeSelectEl . scope ( ) . $destroy ( ) ;
170
186
} ) ;
171
187
} else {
172
- setLabelText ( ) ;
188
+ mdSelectCtrl . setLabelText ( ) ;
173
189
}
174
190
}
175
191
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
-
182
192
function openOnKeypress ( e ) {
183
193
var allowedCodes = [ 32 , 13 , 38 , 40 ] ;
184
194
if ( allowedCodes . indexOf ( e . keyCode ) != - 1 ) {
@@ -192,29 +202,28 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile,
192
202
scope . $evalAsync ( function ( ) {
193
203
var selectEl = selectTemplate . clone ( ) ;
194
204
selectEl . find ( 'md-select-menu' ) . data ( '$ngModelController' , ngModel ) ;
205
+ selectEl . find ( 'md-select-menu' ) . data ( '$mdSelectController' , mdSelectCtrl ) ;
195
206
isOpen = true ;
196
207
$mdSelect . show ( {
197
208
scope : scope . $new ( ) ,
198
209
element : selectEl ,
199
210
target : element [ 0 ] ,
200
211
hasBackdrop : true ,
201
212
loadingAsync : attr . mdOnOpen ? scope . $eval ( attr . mdOnOpen ) : false ,
202
- setLabelText : setLabelText
203
213
} ) . then ( function ( selectedText ) {
204
214
isOpen = false ;
205
215
} ) ;
206
216
} ) ;
207
217
}
208
218
} ;
209
-
210
219
}
211
220
}
212
221
213
222
function SelectMenuDirective ( $parse , $mdUtil , $mdTheming ) {
214
223
215
224
return {
216
225
restrict : 'E' ,
217
- require : [ 'mdSelectMenu' , '?ngModel' ] ,
226
+ require : [ 'mdSelectMenu' , '?mdSelect' , '? ngModel'] ,
218
227
controller : SelectMenuController ,
219
228
link : { pre : preLink }
220
229
} ;
@@ -223,12 +232,13 @@ function SelectMenuDirective($parse, $mdUtil, $mdTheming) {
223
232
// its child options run postLink.
224
233
function preLink ( scope , element , attr , ctrls ) {
225
234
var selectCtrl = ctrls [ 0 ] ;
226
- var ngModel = ctrls [ 1 ] ;
235
+ var mdSelect = ctrls [ 1 ] ;
236
+ var ngModel = ctrls [ 2 ] ;
227
237
228
238
$mdTheming ( element ) ;
229
239
element . on ( 'click' , clickListener ) ;
230
240
element . on ( 'keypress' , keyListener ) ;
231
- if ( ngModel ) selectCtrl . init ( ngModel ) ;
241
+ if ( ngModel ) selectCtrl . init ( ngModel , mdSelect ) ;
232
242
configureAria ( ) ;
233
243
234
244
function configureAria ( ) {
@@ -283,8 +293,9 @@ function SelectMenuDirective($parse, $mdUtil, $mdTheming) {
283
293
self . options = { } ;
284
294
285
295
286
- self . init = function ( ngModel ) {
296
+ self . init = function ( ngModel , mdSelect ) {
287
297
self . ngModel = ngModel ;
298
+ self . mdSelect = mdSelect ;
288
299
289
300
// Allow users to provide `ng-model="foo" ng-model-options="{trackBy: 'foo.id'}"` so
290
301
// that we can properly compare objects set on the model to the available options
@@ -399,11 +410,13 @@ function SelectMenuDirective($parse, $mdUtil, $mdTheming) {
399
410
newSelectedHashes . forEach ( function ( hashKey , i ) {
400
411
self . select ( hashKey , newSelectedValues [ i ] ) ;
401
412
} ) ;
413
+ self . mdSelect && self . mdSelect . setLabelText ( self . selectedLabels ( ) ) ;
402
414
}
403
415
function renderSingular ( ) {
404
416
var value = self . ngModel . $viewValue || self . ngModel . $modelValue ;
405
417
Object . keys ( self . selected ) . forEach ( self . deselect ) ;
406
418
self . select ( self . hashGetter ( value ) , value ) ;
419
+ self . mdSelect && self . mdSelect . setLabelText ( self . selectedLabels ( ) ) ;
407
420
}
408
421
}
409
422
@@ -666,8 +679,6 @@ function SelectProvider($$interimElementProvider) {
666
679
delete opts . disableTarget ;
667
680
}
668
681
669
- opts . setLabelText && opts . setLabelText ( opts . selectEl . controller ( 'mdSelectMenu' ) . selectedLabels ( ) ) ;
670
-
671
682
return $mdUtil . transitionEndPromise ( element ) . then ( function ( ) {
672
683
element . remove ( ) ;
673
684
opts . backdrop && opts . backdrop . remove ( ) ;
0 commit comments