diff --git a/src/ng/directive/ngOptions.js b/src/ng/directive/ngOptions.js index 51d9a3db44dc..79927afc63e6 100644 --- a/src/ng/directive/ngOptions.js +++ b/src/ng/directive/ngOptions.js @@ -639,10 +639,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 385a5d801a03..92f75e0c5603 100644 --- a/test/ng/directive/ngOptionsSpec.js +++ b/test/ng/directive/ngOptionsSpec.js @@ -2135,6 +2135,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({