如果选中了另一个具有相同ID的复选框,如何禁用复选框

时间:2018-12-06 04:15:19

标签: javascript angularjs

我在其中一列中有一个带有复选框的表。选中复选框后,我将该行推入数组。

我试图通过下面的..real world来更好地解释这一点

表中的行可以具有重复的ID(该行的列(flat_id是不同的))。我上面提到的重复ID是user_map_id

当我选中(单击复选框)一行时,我希望禁用其他具有相同user_map_id的行。

因此,当选中一行时,我将user_map_id s存储在一个数组中。然后我这样做:

ng-disabled="selectedUserMapIdArray.indexOf(flat.user_map_id) >= 0

ie如果在选定的user_map_id数组中存在user_map_id,则会禁用该行,但这也会禁用我选中的行,并且如果需要的话,也无法取消选中它。

所以我也将flat_id放入数组中,并执行了以下操作:

ng-disabled="selectedUserMapIdArray.indexOf(flat.user_map_id) >= 0 && selectedFlatNumArray.indexOf(flat.flat_id) < 0 "

ie如果行的user_map_id存在于selectedUserMapIdArray(存储user_map_id)数组中而不存在于selectedFlatNumArray(存储{{ 1}})

但是现在,当我检查具有特定flat_id的行,该行与重复的flat_iduser_map_id中的一个公用时,然后再次检查该组中的一个公用flat_id不会被禁用,因为我上面检查的flat_id存在于flat_id(存储selectedFlatNumArray)中。

关于现实世界的解释

以下是屏幕截图:Image

表中的行是单位所有者和居住者(都有flat_id)的列表。一个单位所有者可以有多个单位(因此表中有重复的user_map_id)。单位所有者可以拥有多个单位(不同的user_map_id)。

但是单位所有者可以有一个占用人(flat_ids不同flat_id)。居住者可以居住在单位所有者的多个单位之一(user_map_id不同,flat_id相同)中。

我希望能够检查任何一个房主(其他人被禁用)和一个住户(如果我愿意的话)。

如果我与某个单位所有者的一个单位进行检查,则属于同一单位所有者的其他行会被禁用并且可以正常工作。

但是,当我与一个乘员检查一行,然后再次检查该乘员的单位所有者(没有相同的user_map_id)时,具有相同flat_id的行将不会被禁用,因为flat_id中存在flat_id(存储flat_id)

我该怎么做?

表格:

selectedFlatNumArray

5 个答案:

答案 0 :(得分:4)

我认为您的ng-disabled和您的ng-title应该简化,以使其易于理解。我建议删除您的数组,并遍历原始数组,以查看在更改一个flat时是否满足您的条件。调试起来容易,避免出错。

<input name="{{flat.flat_no}}" 
       ng-attr-title="{{flat.title}}"
       ng-disabled="flat.isDisabled"
       type="checkbox" 
       ng-change="flatChange(flat)" 
       ng-model="flat.isChecked" />

当您更改复选框以对其他单位进行更改时,我建议遍历您的对象。当心,它是未经测试的代码,因此可能需要一些调整。

$scope.flatChange = function(changedFlat) {
    $scope.someObj.flatsArray.forEach(function(flat) {

        if (changedFlat.checked) {
            if (flat.user_map_id === changedFlat.user_map_id && flat.flat_id !== changedFlat.flat_id) {
                if (changedFlat.idChecked) // If flat is checked, uncheck each one with the same `user_map_id` but not the same `flat_id`.
                    flat.isChecked = false;
                }

                flat.isDisabled = !changedFlat.checked; // `disabled` propriety is the opposite of `checked`.
                flat.title = changedFlat.checked
                            ? 'This user has been already invited'
                            : '';
         }
     });
 };

答案 1 :(得分:2)

我不完全理解您的问题,但是我感觉到,您要对公寓所有者(拥有公寓并可以拥有许多公寓的用户)与公寓住户(占用公寓并且只能居住一个公寓的用户)区别对待单层)。除非您将单位所有者和单位占用者存储在不同的领域,否则您将无法做到这一点,这看起来像您没有这样做。

答案 2 :(得分:1)

您不清楚您的期望行为。您要选择单位还是人?为什么要允许选择居住在公寓中的人来禁用公寓?

我认为您可能只想基于user_id禁用行,给您类似

ng-disabled="selectedUserMapIdArray.indexOf(flat.user_map_id) >= 0 && !flat.isChecked"

答案 3 :(得分:0)

您不能取消选中具有相同id属性的复选框,因为id是唯一的,请尝试将ng-model值从true更改为false

答案 4 :(得分:0)

第一种方法:“禁用具有相同ID的所有行”

您可以放置​​一个onClick函数,在其中可以运行一些代码(延迟10毫秒以确保完成第一个禁用功能),将$ this元素发送到该函数中,然后再次启用此复选框。

在这种方法中,当您单击复选框时,所有相同的复选框将被禁用,然后您单击的复选框将再次启用。