【发布时间】:2017-10-19 22:30:32
【问题描述】:
我遇到了一些angular checkboxes 的特殊问题
我在单独的 divs 中创建它们,每个 checkbox 具有不同的 id,它们将根据来自数据库的一组数据被选中或取消选中。
我觉得这个最好用代码来理解:
html:
<div class="form-group row">
<label for="field_publication" class="col-md-2 form-control-label">Drug/s:</label>
<div class="btn btn-sm btn-primary">
<input type="checkbox" id="check1" ng-checked="drugTypeIds.indexOf(1)!==-1" ng-click="updateSelection(1, publication, 'antimalarials')"> Antimalarial
</div>
<div class="btn btn-sm btn-primary">
<input type="checkbox" id="check2" ng-checked="drugTypeIds.indexOf(2)!==-1" ng-click="updateSelection(2, publication, 'antibiotics')"> Antibiotic
</div>
<div class="btn btn-sm btn-primary">
<input type="checkbox" id="check3" ng-checked="drugTypeIds.indexOf(3)!==-1" ng-click="updateSelection(3, publication, 'antiretrovirals')"> Antiretroviral
</div>
<div class="btn btn-sm btn-primary">
<input type="checkbox" id="check4" ng-checked="drugTypeIds.indexOf(4)!==-1" ng-click="updateSelection(4, publication, 'antidiabetics')"> Antidiabetic
</div>
<div class="btn btn-sm btn-primary">
<input type="checkbox" id="check5" ng-checked="drugTypeIds.indexOf(6)!==-1" ng-click="updateSelection(6, publication, 'antituberculosis')"> Antituberculosis
</div>
<div class="btn btn-sm btn-primary">
<input type="checkbox" id="check6" ng-checked="drugTypeIds.indexOf(5)!==-1" ng-click="updateSelection(5, publication, 'maternal and reproductive')"> Maternal Health
</div>
</div>
所以,ng-checked 告诉代码在数据上传到表单后在我创建的数组中查找对象的 id,这发生在控制器中,用这个方法:
$scope.drugTypeIds = null;
$scope.checkboxes = function (publicationDrugTypes) {
$scope.drugTypeIds = [];
publicationDrugTypes.forEach(function (typeDrug) {
$scope.drugTypeIds.push(typeDrug.id);
});
};
所以,这里drugTypeIds 被初始化为一个空值,直到数据被加载,一旦数据被加载,它将转到publication 对象的变量publicationDrugTypes 并将其作为参数传递给复选框功能:
$scope.checkboxes(formDTO.publication.publicationDrugTypes);
现在为 null 的数组 (drugTypeIds) 将获取 publicationDrugTypes 变量中的 id 值,HTML 代码将选中正确的框。到这里它工作得很好
现在,如果用户想从publication 中添加/删除drugTypes,HTML 将使用控制器中的updateSelection() 代码:
$scope.updateSelection = function (drugTypeId, publication, type){
if ($scope.drugTypeIds.indexOf(drugTypeId)!==-1){
publication.publicationDrugTypes.splice(publication.publicationDrugTypes.indexOf($scope.publicationDrugTypes[drugTypeId-1]),1);
$scope.drugTypeIds.splice($scope.drugTypeIds.indexOf(drugTypeId));
}
else {
publication.publicationDrugTypes.push({id:$scope.publicationDrugTypes[drugTypeId-1].id,name:$scope.publicationDrugTypes[drugTypeId-1].name}); $scope.drugTypeIds.push(drugTypeId);
};
此代码需要新的drugType 的 id,我们将要添加它的publication 和类型(此变量当前未使用)
所以,现在它检查 id 是否在之前的列表中,如果是,则删除它,如果不是,则添加它。
添加在前端和数据库中都可以正常工作,在拼接时我得到几个 checkboxes 同时取消选中自己,我不知道为什么因为它们都有不同的 id、不同的条件和没有附加特定型号。
我已经修改了jsfiddle 中的代码,该错误只有在您第一次运行时才能重现(与我的应用程序中每次都会发生的情况不同),您需要先单击按钮,以便从第一种方法将运行。尝试取消选中Antidiabetic checkbox时会出现错误
【问题讨论】:
-
这段代码不仅第一次出现问题。如果您多次选中复选框,然后取消选中它们,您会看到一个非常奇怪的行为
-
我刚刚分叉了小提琴,如果您使用帖子上的链接,代码现在会出现错误,正如我在解释中所预期的那样,但我无法重现任何其他奇怪的行为
-
仍然困扰着我很多。你能解释一下你的用例是什么吗?我明天会为您更改此示例,以使其正常工作并对其进行清理
标签: javascript angularjs html checkbox