indexof-使用javascript检查数组中是否已有值)
我正在使用angular,我正在尝试创建一个“全选”按钮 我有一个项目列表,每个项目都有一个切换,我正在做的是,在更改时(每次切换从true(selected)更改为false(notselected),我运行一个函数来创建一个包含所选元素的所有ID的数组 这几乎可以完美地工作,问题是我在使用indexfOf方法检查ID是否已经在数组中时遇到了一些问题indexof-使用javascript检查数组中是否已有值),javascript,angularjs,Javascript,Angularjs,我正在使用angular,我正在尝试创建一个“全选”按钮 我有一个项目列表,每个项目都有一个切换,我正在做的是,在更改时(每次切换从true(selected)更改为false(notselected),我运行一个函数来创建一个包含所选元素的所有ID的数组 这几乎可以完美地工作,问题是我在使用indexfOf方法检查ID是否已经在数组中时遇到了一些问题 var isInArray; isInArray = function(arr, id) { console.log("index of
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时
例如,假设my scope.selected如下所示:
scope.selected = [2,3,4,7]
scope.selected = [2,3]
如果单击全选,则不会添加任何内容(这是正确的)
现在,假设我取消勾选4和7,我的scope.selected现在如下所示:
scope.selected = [2,3,4,7]
scope.selected = [2,3]
如果现在单击全选,结果如下:[2,4,7]
我失去了3
我想这是因为我的数组没有一个项目
谢谢您的帮助。这里也有一个快速解释问题的方法。如果您检查控制台并使用开关,您应该能够立即看到我所指的内容
提前感谢我认为您的代码大多包含逻辑错误。您正在使用功能
selectFromList
取消选择(单独完成时)和全选(您不想使用该功能取消选择)
正如有人在“出于某种原因现在已删除”答案中指出的那样,不应使用任何参数调用函数(它仅用于删除最后一个元素),您应该像这样使用splice:
$scope.selected.splice(isInArray($scope.selected,id),1);
除非您真的需要在“全选”上运行发出的功能,否则您可以尝试以下方法:
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;
if (isInArray($scope.selected, element.id) === -1) {
$scope.selected.push(element.id);
}
});
};
scope.selectFromList = function(id, copy) {
if (copy === true && isInArray(scope.selected, id) === -1) {
scope.selected.push(id);
} else {
$scope.selected.splice(isInArray($scope.selected, id), 1);
}
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;
};
现在,如果在
作用域中找不到id,则全选只会添加到作用域。selected
。感谢Matthias和Christian Bonato的建议
最后,我使用他们的两个建议解决了问题,最终结果似乎如预期的那样有效
这是一个带有最终版本的代码笔:
基本上,我改变了
scope.selected.pop(id);
与
在selectAll事件函数中,在向数组添加元素之前,我总是清空作用域。选择[]
$scope.evtSelectAll = function() {
$scope.selected = []
angular.forEach($scope.list, function(element) {
element.copyTo = true;
return $scope.selectFromList(element.id, element.copyTo);
});
})
感谢您的帮助!清空$scope会不会是一个问题。一旦发生切换,请完全选中并通过重新排列列表中选中的元素来重新创建它?不,老实说,我不明白为什么这会是一个问题。我只需要小心,仅在选择所有我猜的选项时清空它,对吗?至少在代码笔示例中,元素ent.iID
应更改为element.id
谢谢,我用id更正了iID谢谢你的回答。我添加了你的行,并且我更改了全选函数以包含第一条注释(空范围。单击全选时选中)有了这两个组合解决方案,它可以根据我的需要工作。谢谢。清空数组似乎是解决这个问题的一个很好的方法,很好的工作我只能在两天内接受。我会尽快接受。谢谢