当我将v-model属性添加到复选框时,全部检查停止工作

时间:2018-12-08 20:22:04

标签: vue.js vuejs2

当我尝试使用v模型获取数组中每个复选框的值时,全检查功能停止工作。我在不同的门户网站上都读了很多问题,包括stackoverflow,人们都说v-模型不适用于我了解的:checked属性,但找不到解决方案/替代代码来使其正常工作。

我尝试过的第一个代码是使用第一个复选框选择所有复选框。这很好。下面的代码:

new Vue({
  el: "#app",
  data: {
    selectAll:false
  },
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <label>
    <input type="checkbox" v-model="selectAll">
    Select all
  </label>
  <br>
  <label>
    <input type="checkbox" :checked="selectAll" value="Item 1">
    Item 1
  </label>
  <br>
  <label>
    <input type="checkbox" :checked="selectAll" value="Item 2">
    Item 2
  </label>
  <br>
  <label>
    <input type="checkbox" :checked="selectAll" value="Item 3">
    Item 3
  </label>
</div>

我尝试的第二个代码是获取数组中每个复选框的值,但是在这种情况下,“全选”将自动停止工作。下面的代码:

new Vue({
  el: "#app",
  data: {
    selectAll:false,
    eachCheckbox: [],
  },
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <label>
    <input type="checkbox" v-model="selectAll">
    Select all
  </label>
  <br>
  <label>
    <input type="checkbox" :checked="selectAll" value="Item 1" v-model="eachCheckbox">
    Item 1
  </label>
  <br>
  <label>
    <input type="checkbox" :checked="selectAll" value="Item 2" v-model="eachCheckbox">
    Item 2
  </label>
  <br>
  <label>
    <input type="checkbox" :checked="selectAll" value="Item 3" v-model="eachCheckbox">
    Item 3
  </label>
  <br>
  Selected checkbox values: {{eachCheckbox}}
  
</div>

我不知道该如何做。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

API调用完成后,请使用Vue.set在复选框数组中创建对象。

这显示了一个模拟的异步api调用,需要2.5秒才能完成。

new Vue({
  el: '#app',
  data () {
    return {
      loading: false,
      checkall: false,
      checkboxes: []
    }
  },
  methods: {
    toggleAll () {
      this.checkall = !this.checkall
      this.checkboxes.forEach(c => {
        c.checked = this.checkall
      })
    }
  },
  watch: {
    checkboxes: {
      deep: true,
      handler: function () {
        this.checkall = this.checkboxes.every(c => c.checked)
      }
    }
  },
  mounted () {
    // simulate an async api call which takes 2.5 seconds to complete
    this.loading = true
    
    setTimeout(() => {
      Array.from(Array(3), (c, i) => ({ checked: false, text: `Option ${i + 1}` })).forEach((c, i) => {
        Vue.set(this.checkboxes, i, c)
      })
      this.loading = false
    }, 2500)
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <input type="checkbox" @click="toggleAll" v-model="checkall"/> Check All<br/>
  <div v-for="(c, i) in checkboxes" :key="i">
    <input type="checkbox" v-model="c.checked"/>{{ c.text }}<br/>
  </div>
  <p v-if="!loading">Checked: {{ checkboxes.filter(c => c.checked).map(c => c.text).join(',') }}</p>
  <p v-else>Fetching data...</p>
</div>

答案 1 :(得分:1)

我之前也遇到过同样的问题,但找不到很好的解决方案,但是我尝试了以下操作:

new Vue({
  el: "#app",
  data: {
    selectAll: false,
    eachCheckbox: [],
  },
  methods: {
    selectAllItems() {

      this.selectAll ? this.eachCheckbox = ["Item 1", "Item 2", "Item 3"] : this.eachCheckbox = [];
    }

  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <label>
    <input type="checkbox" v-model="selectAll" @change="selectAllItems">
    Select all
  </label>
  <br>
  <label>
    <input type="checkbox" :checked="selectAll" value="Item 1" v-model="eachCheckbox">
    Item 1
  </label>
  <br>
  <label>
    <input type="checkbox" :checked="selectAll" value="Item 2" v-model="eachCheckbox">
    Item 2
  </label>
  <br>
  <label>
    <input type="checkbox" :checked="selectAll" value="Item 3" v-model="eachCheckbox">
    Item 3
  </label>
  <br> Selected checkbox values: {{eachCheckbox}}

</div>