diff --git a/src/directives/model/select.js b/src/directives/model/select.js index 947efdc18df..7cb3d9a244d 100644 --- a/src/directives/model/select.js +++ b/src/directives/model/select.js @@ -98,7 +98,12 @@ function initOptions (expression) { while (i--) { var option = el.options[i] if (option !== defaultOption) { - el.removeChild(option) + var parentNode = option.parentNode + if (parentNode === el) { + parentNode.removeChild(option) + } else { + el.removeChild(parentNode) + } } } buildOptions(el, value) diff --git a/test/unit/specs/directives/model_spec.js b/test/unit/specs/directives/model_spec.js index 72914d2dae7..1661e00d273 100644 --- a/test/unit/specs/directives/model_spec.js +++ b/test/unit/specs/directives/model_spec.js @@ -341,8 +341,8 @@ if (_.inBrowser) { expect(opts[2].selected).toBe(true) }) - it('select + options + optgroup', function () { - new Vue({ + it('select + options + optgroup', function (done) { + var vm = new Vue({ el: el, data: { test: 'b', @@ -365,6 +365,26 @@ if (_.inBrowser) { expect(opts[0].selected).toBe(false) expect(opts[1].selected).toBe(true) expect(opts[2].selected).toBe(false) + vm.opts = [ + { label: 'X', options: ['x', 'y'] }, + { label: 'Y', options: ['z'] } + ] + vm.test = 'y' + _.nextTick(function () { + expect(el.firstChild.innerHTML).toBe( + '' + + '' + + '' + + '' + + '' + + '' + ) + var opts = el.firstChild.options + expect(opts[0].selected).toBe(false) + expect(opts[1].selected).toBe(true) + expect(opts[2].selected).toBe(false) + done() + }) }) it('select + options with Object value', function (done) {