我在其中一列中有一个带有复选框的表。选中复选框后,我将该行推入数组。
我试图通过下面的..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_id
,user_map_id
中的一个公用时,然后再次检查该组中的一个公用flat_id
不会被禁用,因为我上面检查的flat_id
存在于flat_id
(存储selectedFlatNumArray
)中。
关于现实世界的解释
表中的行是单位所有者和居住者(都有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
答案 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元素发送到该函数中,然后再次启用此复选框。
在这种方法中,当您单击复选框时,所有相同的复选框将被禁用,然后您单击的复选框将再次启用。