Преглед изворни кода

fix: checkbox v-model="array" ignore false-value (#6180)

close #6178
Nick Messing пре 9 година
родитељ
комит
3d14e855e4

+ 1 - 1
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($$c){$$i<0&&(${value}=$$a.concat($$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

+ 28 - 0
test/unit/features/directives/model-checkbox.spec.js

@@ -77,6 +77,34 @@ describe('Directive v-model checkbox', () => {
     }).then(done)
   })
 
+  it('bind to Array value ignores false-value', done => {
+    const vm = new Vue({
+      data: {
+        test: ['1']
+      },
+      template: `
+        <div>
+          <input type="checkbox" v-model="test" value="1" :false-value="true">
+          <input type="checkbox" v-model="test" value="2" :false-value="true">
+        </div>
+      `
+    }).$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', '1'])
+    vm.test = ['1']
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].checked).toBe(true)
+      expect(vm.$el.children[1].checked).toBe(false)
+    }).then(done)
+  })
+
   it('bind to Array value with value bindings', done => {
     const vm = new Vue({
       data: {