diff --git a/src/ng/directive/ngOptions.js b/src/ng/directive/ngOptions.js index 83b2d3ae6e1d..8032253573e9 100644 --- a/src/ng/directive/ngOptions.js +++ b/src/ng/directive/ngOptions.js @@ -635,10 +635,15 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) { var emptyOption_ = emptyOption && emptyOption[0]; var unknownOption_ = unknownOption && unknownOption[0]; + // We cannot rely on the extracted empty option being the same as the compiled empty option, + // because the compiled empty option might have been replaced by a comment because + // it had an "element" transclusion directive on it (such as ngIf) if (emptyOption_ || unknownOption_) { while (current && (current === emptyOption_ || - current === unknownOption_)) { + current === unknownOption_ || + current.nodeType === NODE_TYPE_COMMENT || + current.value === '')) { current = current.nextSibling; } } diff --git a/test/ng/directive/ngOptionsSpec.js b/test/ng/directive/ngOptionsSpec.js index c5dac4b72914..09b4dd26e943 100644 --- a/test/ng/directive/ngOptionsSpec.js +++ b/test/ng/directive/ngOptionsSpec.js @@ -2144,6 +2144,52 @@ describe('ngOptions', function() { }); + it('should be possible to use ngIf in the blank option', function() { + var option; + createSingleSelect(''); + + scope.$apply(function() { + scope.values = [{name: 'A'}]; + scope.isBlank = true; + }); + + expect(element.find('option').length).toBe(2); + option = element.find('option').eq(0); + expect(option.val()).toBe(''); + expect(option.text()).toBe('blank'); + + scope.$apply(function() { + scope.isBlank = false; + }); + + expect(element.find('option').length).toBe(1); + option = element.find('option').eq(0); + expect(option.text()).toBe('A'); + }); + + + it('should be possible to use ngIf in the blank option when values are available upon linking', + function() { + var options; + + scope.values = [{name: 'A'}]; + createSingleSelect(''); + + scope.$apply('isBlank = true'); + + options = element.find('option'); + expect(options.length).toBe(2); + expect(options.eq(0).val()).toBe(''); + expect(options.eq(0).text()).toBe('blank'); + + scope.$apply('isBlank = false'); + + options = element.find('option'); + expect(options.length).toBe(1); + expect(options.eq(0).text()).toBe('A'); + } + ); + it('should not throw when a directive compiles the blank option before ngOptions is linked', function() { expect(function() { createSelect({