使用ref

时间:2018-09-07 07:27:58

标签: checkbox vue.js reference

我正在尝试创建select all功能。以下是我的组件,

(function(){
	var template = ' <table>\
						<tr>\
							<td rowspan=2><input type="checkbox" @change="allSelectChanged"/>All</td>\
						</tr>\
						<tr v-for="i in rows">\
							<td  ><input type="checkbox" ref="select" @change="changedSelection(i,$event)" />Selection {{i}}</td>\
						</tr>\
					</table>';
	var component = { 
		template : template,
		data:function(){
			return {
				rows:5
			}
		},
		methods:{
			allSelectChanged:function(e){
				_.each(this.$refs.select,function(s){
					s.checked = e.target.checked;
				});
			},
			changedSelection:function(i,e){
				console.log("Selection changed",i,e.target.checked);
			}
		}
	}
    Vue.component('sample', component);
})();

var app = new Vue({
  el: '#app',
  data: {
  },
  methods:{ 
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> 
<script src="https://underscorejs.org/underscore-min.js"></script> 

</style> 
<div id="app">  
	<sample />
</div>

当我选中/取消选中任何复选框changedSelection时,都会调用该函数。但是,当我选中/取消选中all复选框时,复选框已被选中,但未调用相应的changedSelection函数。

为什么通过ref进行更改时未调用changedSelection

1 个答案:

答案 0 :(得分:1)

相反,在vue数据中设置新元素,并使用v-model="selection"绑定

new Vue({
  el:'#app',
  data:{
    rows:[{id:1,sel:false},{id:2,sel:false},{id:3,sel:false},{id:4,sel:false},{id:5,sel:false}],
    selection:false,
    selAll:false
  },
  methods:{
    changedSelection:function(i){
        console.log(i.id +" is "+ (i.sel?' checked ': 'unchecked') );
    },
    changedAllSelection:function(){
        for(let i in this.rows){
          this.rows[i].sel = this.selAll;
          console.log(this.rows[i].id +" is "+ (this.rows[i].sel?' checked ': 'unchecked') );
        }
        console.log("Select All : " + this.selAll);
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<div>
<input type="checkbox" ref="select" v-model="selAll" @change="changedAllSelection" />Selection All : {{(selAll?' checked ': 'unchecked')}}
<div v-for="i in rows">
<input type="checkbox" ref="select" v-model="i.sel" @change="changedSelection(i)" />Selection {{i.id}} : {{(i.sel?' checked ': 'unchecked')}}
</div>
</div>
</div>