我正在使用 angular,我正在尝试创建一个“全选”按钮。
我有一个项目列表,每个项目都有一个切换,我正在做的是,在更改时(每次切换从真(选中)变为假(未选中)时,我运行一个函数来创建一个数组所选元素的所有 ID。
这几乎完美地工作,问题是我在使用 indexfOf 方法检查 ID 是否已经在数组中时遇到了一些问题。
var isInArray;
isInArray = function(arr, id) {
console.log("index of ", arr.indexOf(id));
return arr.indexOf(id);
};
scope.evtSelectAll = function() {
return angular.forEach(scope.listToDisplay, function(element) {
element.copyTo = true;
return scope.selectFromList(element.iID, element.copyTo);
});
};
scope.selectFromList = function(id, copy) {
if (copy === true && isInArray(scope.selected, id) === -1) {
scope.selected.push(id);
} else {
scope.selected.pop(id);
}
console.log("scope.selected - ", scope.selected);
if (scope.selected.length > 0) {
console.log("Emitted event: can proceed!");
scope.$emit('enough-elements');
} else {
console.log("Emitted event: can not proceed!");
scope.$emit('not-enough-elements');
}
return scope.result = scope.selected;
};
我遇到的问题是数组 (scope.selected) 有多个 ID。
例如,假设我的 scope.selected 看起来像这样:
scope.selected = [2,3,4,7]
如果我单击全选,则不会添加任何内容(这是正确的)
现在,假设我取消勾选 4 和 7,我的 scope.selected 现在看起来像这样:
scope.selected = [2,3]
如果我现在点击全选,我的结果如下:[2,4,7]。
我输了 3
我认为这是因为我的数组没有一项吗?
感谢您的帮助。这也是一个快速 codepen来解释问题。如果您查看控制台并使用开关,您应该能够立即明白我指的是什么。
提前致谢
最佳答案
感谢 Matthias 和 Christian Bonato 的建议。
最后,我使用他们的两个建议解决了问题,最终结果似乎按预期工作。
这是带有最终版本的代码笔:http://codepen.io/NickHG/pen/KNXPBb
基本上,我改变了
scope.selected.pop(id);
与
$scope.selected.splice( isInArray($scope.selected, id),1);
在 selectAll 事件函数中,我总是在向数组添加元素之前清空 scope.selected[]
$scope.evtSelectAll = function() {
$scope.selected = []
angular.forEach($scope.list, function(element) {
element.copyTo = true;
return $scope.selectFromList(element.id, element.copyTo);
});
};
谢谢你的帮助!
关于javascript - indexof - 检查一个值是否已经在 javascript 数组中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40843491/