@@ -383,6 +383,64 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
383
383
// clear contents, we'll add what's needed based on the model
384
384
selectElement . empty ( ) ;
385
385
386
+ function getViewValue ( el , scope , locals , collection , multiple ) {
387
+ var key = el . val ( ) ;
388
+ var value ;
389
+ var calculateViewValue ;
390
+
391
+ if ( selectAsFn ) {
392
+ calculateViewValue = function ( ) {
393
+ var collectionWithValueName = { } ;
394
+ collectionWithValueName [ valueName ] = collection [ key ] ;
395
+ collectionWithValueName [ keyName ] = key ;
396
+
397
+ for ( var i in collection ) {
398
+ if ( collection . hasOwnProperty ( i ) ) {
399
+ locals [ valueName ] = collection [ i ] ;
400
+ if ( keyName ) locals [ keyName ] = i ;
401
+ if ( selectAsFn ( scope , locals ) ==
402
+ selectAsFn ( scope , collectionWithValueName ) ) {
403
+ return selectAsFn ( scope , locals ) ;
404
+ }
405
+ }
406
+ }
407
+ } ;
408
+ } else if ( trackFn ) {
409
+ calculateViewValue = function ( ) {
410
+ for ( var trackIndex = 0 ; trackIndex < collection . length ; trackIndex ++ ) {
411
+ locals [ valueName ] = collection [ trackIndex ] ;
412
+ if ( trackFn ( scope , locals ) == key ) {
413
+ return valueFn ( scope , locals ) ;
414
+ }
415
+ }
416
+ } ;
417
+ }
418
+ else {
419
+ calculateViewValue = function ( ) {
420
+ locals [ valueName ] = collection [ key ] ;
421
+ if ( keyName ) locals [ keyName ] = key ;
422
+ return valueFn ( scope , locals ) ;
423
+ } ;
424
+ }
425
+
426
+ if ( multiple ) {
427
+ if ( keyName ) locals [ keyName ] = key ;
428
+ calculateViewValue ( ) ;
429
+
430
+ return ( selectAsFn || valueFn ) ( scope , locals ) ;
431
+ }
432
+
433
+ if ( key == '?' ) {
434
+ value = undefined ;
435
+ } else if ( key === '' ) {
436
+ value = null ;
437
+ } else {
438
+ value = calculateViewValue ( ) ;
439
+ }
440
+
441
+ return value ;
442
+ }
443
+
386
444
selectElement . on ( 'change' , function ( ) {
387
445
scope . $apply ( function ( ) {
388
446
var optionGroup ,
@@ -400,67 +458,12 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
400
458
401
459
for ( index = 1 , length = optionGroup . length ; index < length ; index ++ ) {
402
460
if ( ( optionElement = optionGroup [ index ] . element ) [ 0 ] . selected ) {
403
- key = optionElement . val ( ) ;
404
- if ( keyName ) locals [ keyName ] = key ;
405
- if ( selectAsFn ) {
406
- var collectionWithValueName = { } ;
407
- collectionWithValueName [ valueName ] = collection [ key ] ;
408
- collectionWithValueName [ keyName ] = key ;
409
-
410
- for ( i in collection ) {
411
- if ( collection . hasOwnProperty ( i ) ) {
412
- locals [ valueName ] = collection [ i ] ;
413
- locals [ keyName ] = i ;
414
- if ( selectAsFn ( scope , locals ) ==
415
- selectAsFn ( scope , collectionWithValueName ) ) break ;
416
- }
417
-
418
- }
419
- } else if ( trackFn ) {
420
- for ( trackIndex = 0 ; trackIndex < collection . length ; trackIndex ++ ) {
421
- locals [ valueName ] = collection [ trackIndex ] ;
422
- if ( trackFn ( scope , locals ) == key ) break ;
423
- }
424
- } else {
425
- locals [ valueName ] = collection [ key ] ;
426
- }
427
- value . push ( ( selectAsFn || valueFn ) ( scope , locals ) ) ;
461
+ value . push ( getViewValue ( optionElement , scope , locals , collection , true ) )
428
462
}
429
463
}
430
464
}
431
465
} else {
432
- key = selectElement . val ( ) ;
433
- if ( key == '?' ) {
434
- value = undefined ;
435
- } else if ( key === '' ) {
436
- value = null ;
437
- } else {
438
- if ( selectAsFn ) {
439
- for ( i = 0 ; i < collection . length ; i ++ ) {
440
- locals [ valueName ] = collection [ i ] ;
441
- var collectionWithValueName = { } ;
442
- collectionWithValueName [ valueName ] = collection [ key ] ;
443
-
444
- if ( selectAsFn ( scope , locals ) === selectAsFn ( scope , collectionWithValueName ) ) {
445
- value = selectAsFn ( scope , locals ) ;
446
- break ;
447
- }
448
- }
449
- } else if ( trackFn ) {
450
- for ( trackIndex = 0 ; trackIndex < collection . length ; trackIndex ++ ) {
451
- locals [ valueName ] = collection [ trackIndex ] ;
452
-
453
- if ( trackFn ( scope , locals ) == key ) {
454
- value = valueFn ( scope , locals ) ;
455
- break ;
456
- }
457
- }
458
- } else {
459
- locals [ valueName ] = collection [ key ] ;
460
- if ( keyName ) locals [ keyName ] = key ;
461
- value = valueFn ( scope , locals ) ;
462
- }
463
- }
466
+ value = getViewValue ( selectElement , scope , locals , collection ) ;
464
467
}
465
468
ctrl . $setViewValue ( value ) ;
466
469
render ( ) ;
0 commit comments