我正在尝试制作一个示例,其中我有一个复选框列表。我可以使用ng-repeat显示列表。
如果用户点击一个复选框(仅选中一个复选框),我需要的是。仅显示一列(100%)宽度。用户选中两列时,它显示两列宽度相等(50%)的列。用户检查三列它显示三个相等宽度的列。如同用户选中四个复选框,它显示四个相等宽度的列。最初选中一些复选框(选中:真实).. < / p>
这是我的代码 http://codepen.io/anon/pen/adBroe?editors=101
init();
function init(){
for(var i =0;i<self.data.length;i++){
var obj=self.data[i];
if(obj.checked)
{
self.selectedList.push(obj);
}
}
alert('starting '+self.selectedList.length)
}
self.checkBoxClick=function(obj,i){
if(obj.checked)
{
alert('if')
self.selectedList.push(obj);
}else
{
alert('else'+i);
self.selectedList.splice(i,1);
}
alert(self.selectedList.length);
}
})
这是我试图显示
<div class='container-fluid'>
<div class='row'>
<div ng-repeat="i in vm.selectedList" class='col-xs-{{12/vm.selectedList.length}}'>
{{i.name}}
</div>
</div>
</div>
答案 0 :(得分:4)
它可以更简单。在HTML中,您甚至不需要ngChange
处理程序,只需绑定到checked属性:
<div class="checkbox" ng-repeat='v in vm.data'>
<label>
<input type="checkbox" ng-model='v.checked'> {{v.name}}
</label>
</div>
然后使用ngRepeat
:
<div ng-repeat="i in filteredList = (vm.data | filter:{checked:true})" class='col-xs-{{12/filteredList.length}}'>
{{i.name}}
</div>
结果,干净的控制器完全没有任何逻辑,Angular使用模板vm.data | filter:{checked:true}
进行所有必要的列过滤。
答案 1 :(得分:2)
这种情况正在发生,因为你试图将它从第二个索引中移除而训练3出现在第0个索引。
else
{
alert('unchecked '+i);
var index = self.selectedList.indexOf(obj);
self.selectedList.splice(index,1);
}
将您的其他部分更改为此。它会正常工作。