J'ai une table avec une case à cocher dans l'une des colonnes. Lorsqu'une case à cocher est cochée I Poussez la ligne dans un tableau.
J'ai essayé de mieux l'expliquer en termes de monde réel en bas
La table peut avoir des lignes avec un ID en double (la colonne de la ligne (flat_id
) est différente). L'identifiant en double que j'ai mentionné ci-dessus est user_map_id
.
Lorsque je coche (coche) une ligne, je souhaite désactiver les autres lignes avec le même user_map_id
.
Ainsi, quand une ligne est cochée, je stocke le user_map_id
s dans un tableau. Et puis je fais ça:
ng-disabled="selectedUserMapIdArray.indexOf(flat.user_map_id) >= 0
c'est-à-dire que je désactive la ligne si le user_map_id
est présent dans le tableau avec le user_map_id
s sélectionné, mais cela désactive celui que j'ai coché aussi et je ne peux pas le décocher si je le souhaite.
J'ai donc poussé le flat_id
s dans un tableau aussi et j'ai fait ceci:
ng-disabled="selectedUserMapIdArray.indexOf(flat.user_map_id) >= 0 && selectedFlatNumArray.indexOf(flat.flat_id) < 0 "
i.e Désactiver la ligne si le user_map_id
de la ligne est présent dans le tableau selectedUserMapIdArray
(qui stocke le user_map_id
) et non présent dans la selectedFlatNumArray
(qui stocke le flat_id
)
Mais maintenant, lorsque je vérifie une ligne qui a un flat_id
particulier qui est commun avec l’un des user_map_id
en double, flat_id
en double, puis de nouveau dans le groupe, celle avec le flat_id
commun ne sera pas désactivée car le flat_id
que j’ai vérifié ci-dessus est présent dans la selectedFlatNumArray
(qui stocke le flat_id
).
Expliquer en termes de monde réel
Les lignes dans la table sont une liste de propriétaires et d'occupants d'appartements (les deux ont user_map_id
). Un propriétaire d'appartement peut avoir plusieurs appartements (par conséquent, dupliquer user_map_id
s dans le tableau). Le propriétaire de l'appartement peut avoir plusieurs appartements (différents flat_ids
).
Mais le propriétaire de l'appartement peut avoir un occupant (même flat_id
différent user_map_id
). L'occupant peut résider dans l'un des nombreux appartements du propriétaire (même flat_id
différent user_map_id
).
Je veux pouvoir vérifier n'importe lequel des propriétaires de l'appartement (les autres deviennent handicapés) et aussi un occupant (si je le souhaite).
Si je vérifie la rangée avec l'un des appartements du propriétaire, les autres rangées appartenant au même propriétaire sont désactivées et fonctionnent correctement.
Mais lorsque je vérifie une ligne avec un occupant, puis à nouveau un propriétaire d'appartement de cet occupant (qui n'a pas le même flat_id
), la ligne avec le même flat_id
ne sera pas désactivée car le flat_id
est présent dans la selectedFlatNumArray
(qui stocke l'identifiant )
Comment puis-je faire cela?
La table:
<tbody>
<tr ng-repeat="flat in someObj.flatsArray | filter:searchFlat">
<td>{{ flat.occupant_name || flat.owner_name}}</td>
<td>{{flat.flat_no}}</td>
<td class="text-center">
<input class="" name="{{flat.flat_no}}" ng-attr-title="{{(selectedUserMapIdArray.indexOf(flat.user_map_id) >= 0 && selectedFlatNumArray.indexOf(flat.flat_id) < 0) ? 'This user has been already invited' : ''}}"
ng-disabled="selectedUserMapIdArray.indexOf(flat.user_map_id) >= 0 && selectedFlatNumArray.indexOf(flat.flat_id) < 0 "
type="checkbox" ng-change="checkChanged(flat.isChecked, flat)" ng-model="flat.isChecked" />
</td>
</tr>
</tbody>
Je pense que votre ng-disabled
et votre ng-title
devraient être simplifiés pour qu'il soit plus facile à suivre. Je propose de supprimer vos tableaux et d'effectuer une itération sur votre original pour voir s'il répond à vos conditions lorsqu'un flat
est modifié. Il serait plus facile de déboguer et d'éviter les erreurs.
<input name="{{flat.flat_no}}"
ng-attr-title="{{flat.title}}"
ng-disabled="flat.isDisabled"
type="checkbox"
ng-change="flatChange(flat)"
ng-model="flat.isChecked" />
Je proposerais de parcourir votre objet lorsque vous modifiez une case à cocher pour apporter les modifications aux autres appartements. Attention, c'est du code non testé, il peut donc nécessiter quelques ajustements.
$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'
: '';
}
});
};
Je ne comprends pas tout à fait votre question, mais j’ai l’impression que vous souhaitez traiter les propriétaires d’appartements (les utilisateurs propriétaires d’appartements et pouvant posséder de nombreux appartements) différemment des occupants d’habitation (les utilisateurs occupant des appartements et ne pouvant occuper qu’un seul appartement). . Vous ne pourrez faire cela que si vous stockez des propriétaires et des occupants d'appartements dans différents domaines, ce qui semble être le cas.
Votre comportement souhaité n'est pas clair pour moi. Vous choisissez des appartements ou des personnes? Pourquoi désactivez-vous les appartements lorsque vous souhaitez autoriser la sélection de personnes occupant les appartements?
Je pense que vous voulez probablement simplement désactiver les lignes basées sur le user_id, vous donnant quelque chose comme
ng-disabled="selectedUserMapIdArray.indexOf(flat.user_map_id) >= 0 && !flat.isChecked"
depuis votre première méthode: "désactiver toutes les lignes avec le même identifiant"
vous pouvez mettre une fonction onClick dans laquelle vous pouvez exécuter du code (avec un délai de 10 ms pour vous assurer que votre première fonction de désactivation est terminée), envoyez $ cet élément dans la fonction et activez à nouveau cette case.
dans cette méthode, lorsque vous cliquez sur une case à cocher, toutes les mêmes cases sont désactivées, puis la case sur laquelle vous cliquez est réactivée.
Vous ne pouvez pas décocher les cases avec la même propriété id, car id est unique, essayez de changer la valeur de ng-model de true à false