@@ -592,6 +592,12 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
592
592
593
593
// ------------------------------------------------------------------ //
594
594
595
+ function addOptionElement ( option , parent ) {
596
+ var optionElement = optionTemplate . cloneNode ( false ) ;
597
+ parent . appendChild ( optionElement ) ;
598
+ updateOptionElement ( option , optionElement ) ;
599
+ }
600
+
595
601
596
602
function updateOptionElement ( option , element ) {
597
603
option . element = element ;
@@ -612,11 +618,12 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
612
618
var previousValue = options && selectCtrl . readValue ( ) ;
613
619
614
620
// We must remove all current options, but cannot simply set innerHTML = null
615
- // since the providedOption might have an ngIf on it that inserts comments which we must
616
- // preserve
617
- // Instead iterate over the current option elements and remove them or their optgroup
621
+ // since the providedEmptyOption might have an ngIf on it that inserts comments which we
622
+ // must preserve.
623
+ // Instead, iterate over the current option elements and remove them or their optgroup
618
624
// parents
619
625
if ( options ) {
626
+
620
627
for ( var i = options . items . length - 1 ; i >= 0 ; i -- ) {
621
628
var option = options . items [ i ] ;
622
629
if ( option . group ) {
@@ -629,26 +636,24 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
629
636
630
637
options = ngOptions . getOptions ( ) ;
631
638
632
- var groupMap = { } ;
639
+ var groupElementMap = { } ;
633
640
var listFragment = $document [ 0 ] . createDocumentFragment ( ) ;
634
641
635
642
// Ensure that the empty option is always there if it was explicitly provided
636
643
if ( providedEmptyOption ) {
637
644
selectElement . prepend ( emptyOption ) ;
638
645
}
639
646
640
- options . items . forEach ( function updateOption ( option ) {
641
- var group ;
647
+ options . items . forEach ( function addOption ( option ) {
642
648
var groupElement ;
643
- var optionElement ;
644
649
645
650
if ( isDefined ( option . group ) ) {
646
651
647
652
// This option is to live in a group
648
653
// See if we have already created this group
649
- group = groupMap [ option . group ] ;
654
+ groupElement = groupElementMap [ option . group ] ;
650
655
651
- if ( ! group ) {
656
+ if ( ! groupElement ) {
652
657
653
658
groupElement = optGroupTemplate . cloneNode ( false ) ;
654
659
listFragment . appendChild ( groupElement ) ;
@@ -657,21 +662,15 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
657
662
groupElement . label = option . group ;
658
663
659
664
// Store it for use later
660
- group = groupMap [ option . group ] = {
661
- groupElement : groupElement
662
- } ;
663
-
665
+ groupElementMap [ option . group ] = groupElement ;
664
666
}
665
667
666
- optionElement = optionTemplate . cloneNode ( false ) ;
667
- group . groupElement . appendChild ( optionElement ) ;
668
- updateOptionElement ( option , optionElement ) ;
668
+ addOptionElement ( option , groupElement ) ;
669
669
670
670
} else {
671
671
672
- optionElement = optionTemplate . cloneNode ( false ) ;
673
- listFragment . appendChild ( optionElement ) ;
674
- updateOptionElement ( option , optionElement ) ;
672
+ // This option is not in a group
673
+ addOptionElement ( option , listFragment ) ;
675
674
}
676
675
} ) ;
677
676
0 commit comments