【问题标题】:Check-all stops working when I add v-model attribute to the checkboxes当我将 v-model 属性添加到复选框时,Check-all 停止工作
【发布时间】:2018-12-08 20:22:03
【问题描述】:

当我尝试使用 v-model 获取数组中每个复选框的值时,Check-all 功能停止工作。我在包括 stackoverflow 在内的不同门户网站上阅读了很多问题,人们说 v-model 不适用于 :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>

我不知道如何进行这项工作。有人可以帮忙吗?

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component


    【解决方案1】:

    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>

    【讨论】:

    • 非常感谢您的解决方案。尽管这很好用,但在我的情况下不是,因为我的数据将通过 ajax/axios 请求直接来自数据库,并且 v-for 将具有来自数据库的数据数组而不是“复选框”。您是否可以建议替代数据中的复选框数组?
    • 我已经更新了答案,以展示它如何处理来自 api 调用的数据。
    • 抱歉不清楚。这是我的问题的一个小提琴:[链接](jsfiddle.net/pranavkaistha/eywraw8t/498191)。你能帮我在这项工作中制作“全选”吗? 无需更改语言FromDB 中的任何内容,因为这将来自数据库,我无法向其中添加选中的属性。
    • 谢谢。如果我从任何语言中删除勾号,您是否也可以使“全选”勾号消失?就像它在您的第一个答案中起作用一样。
    【解决方案2】:

    我之前遇到过同样的问题,但我没有找到好的解决方案,但我尝试了以下类似的方法:

    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>

    【讨论】:

      猜你喜欢
      • 2018-08-05
      • 2019-02-04
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 2019-03-12
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多