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({