From 88aa6a92d11da0558cb519aa12e061c4507e3979 Mon Sep 17 00:00:00 2001 From: Nicolai Moraru Date: Wed, 26 Jul 2017 13:09:16 +1200 Subject: [PATCH 1/2] fix($compiler): Allow using array value with array v-model in imput[type="checkbox"] #6219 --- .../web/compiler/directives/model.js | 2 +- .../directives/model-checkbox.spec.js | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/platforms/web/compiler/directives/model.js b/src/platforms/web/compiler/directives/model.js index 8f5951eac56..825c8200267 100644 --- a/src/platforms/web/compiler/directives/model.js +++ b/src/platforms/web/compiler/directives/model.js @@ -93,7 +93,7 @@ function genCheckboxModel ( 'if(Array.isArray($$a)){' + `var $$v=${number ? '_n(' + valueBinding + ')' : valueBinding},` + '$$i=_i($$a,$$v);' + - `if($$el.checked){$$i<0&&(${value}=$$a.concat($$v))}` + + `if($$el.checked){$$i<0&&(${value}=$$a.concat(Array.isArray($$v)?[$$v]:$$v))}` + `else{$$i>-1&&(${value}=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}` + `}else{${genAssignmentCode(value, '$$c')}}`, null, true diff --git a/test/unit/features/directives/model-checkbox.spec.js b/test/unit/features/directives/model-checkbox.spec.js index 2c296ccbf5a..e102af62609 100644 --- a/test/unit/features/directives/model-checkbox.spec.js +++ b/test/unit/features/directives/model-checkbox.spec.js @@ -161,6 +161,34 @@ describe('Directive v-model checkbox', () => { }).then(done) }) + it('bind to Array value with array value bindings (object loose equal)', done => { + const vm = new Vue({ + data: { + test: [{ a: 1 }] + }, + template: ` +
+ + +
+ ` + }).$mount() + document.body.appendChild(vm.$el) + expect(vm.$el.children[0].checked).toBe(true) + expect(vm.$el.children[1].checked).toBe(false) + vm.$el.children[0].click() + expect(vm.test.length).toBe(0) + vm.$el.children[1].click() + expect(vm.test).toEqual([[2]]) + vm.$el.children[0].click() + expect(vm.test).toEqual([[2], { a: 1 }]) + vm.test = [{ a: 1 }] + waitForUpdate(() => { + expect(vm.$el.children[0].checked).toBe(true) + expect(vm.$el.children[1].checked).toBe(false) + }).then(done) + }) + it('.number modifier', () => { const vm = new Vue({ data: { From e25d78f04da1c149a8dc900c8d038006b5eb10d8 Mon Sep 17 00:00:00 2001 From: Nicolai Moraru Date: Wed, 26 Jul 2017 22:45:48 +1200 Subject: [PATCH 2/2] refactor($compile): Remove unnecesarry ternary --- src/platforms/web/compiler/directives/model.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platforms/web/compiler/directives/model.js b/src/platforms/web/compiler/directives/model.js index 825c8200267..7c662629b65 100644 --- a/src/platforms/web/compiler/directives/model.js +++ b/src/platforms/web/compiler/directives/model.js @@ -93,7 +93,7 @@ function genCheckboxModel ( 'if(Array.isArray($$a)){' + `var $$v=${number ? '_n(' + valueBinding + ')' : valueBinding},` + '$$i=_i($$a,$$v);' + - `if($$el.checked){$$i<0&&(${value}=$$a.concat(Array.isArray($$v)?[$$v]:$$v))}` + + `if($$el.checked){$$i<0&&(${value}=$$a.concat([$$v]))}` + `else{$$i>-1&&(${value}=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}` + `}else{${genAssignmentCode(value, '$$c')}}`, null, true