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