J'ai une variable selectedSubTopicId
et un tableau d'objets subTopic: objectiveDetail.subTopics[]
. Chaque subTopic
objet a un champ subTopicId
Je voudrais l'utiliser pour activer ou désactiver et le bouton Ajouter un sujet. Puis-je utiliser lodash dans ng-disabled pour tester ce tableau et indiquer la valeur true si l'un des éléments d'objet subTopic
du tableau a une subTopicId
égale à selectedSubTopicId
.
Voici un exemple des données contenues dans objectiveDetail. Dans ce cas, il n'y a qu'un élément dans le tableau subTopics.
{"objectiveDetailId":285,
"objectiveId":29,
"number":1,
"text":"x",
"subTopics":[{"subTopicId":1,
"number":1}]
}
Voici le code dans mon contrôleur angulaire suggéré par thefourtheye:
$scope.checkDuplicateSubTopicId = function (objectiveDetail, sSubTopic) {
if (_.some(objectiveDetail.subTopics, function(currentTopic) {
return _.contains(currentTopic, selectedSubTopicId);
})) {
return true;
} else {
return false;
}
}
Mon bouton avec la fonction de clic non affichée ressemble à ceci:
<button data-ng-disabled="checkDuplicateSubTopicId(objectiveDetail, subTopicId)">
Add Topic
</button>
Le problème est que cela ne fonctionne pas tout à fait et que le bouton n’affiche pas désactivé.
Vous n'avez pas demandé comment faire, mais je suppose que c'est ce que vous vouliez savoir.
Comme je l'ai déjà mentionné, vous pouvez utiliser _.some
, qui effectuera une itération sur tous les éléments du tableau et exécutera un rappel. Dans ce rappel, vous pouvez tester si la valeur de la propriété du sujet est égale à la valeur de la variable:
var result = _.some(objectiveDetail.subTopics, function (topic) {
return topic.subTopicId === selectedSubTopicId;
});
_.some
ignorera les éléments restants s'il en a trouvé un pour lequel le rappel a retourné true
.
Il y a aussi une forme un peu plus élégante:
var result = _.some(objectiveDetail.subTopics, {subTopicId: selectedSubTopicId});
Vous pouvez utiliser _.some
method, comme ceci
var _ = require("lodash");
var objectiveDetail = {"objectiveDetailId":285,
"objectiveId":29,
"number":1,
"text":"x",
"subTopics":[{"subTopicId":1,
"number":1}]
};
var selectedSubTopicId = 1;
if (_.some(objectiveDetail.subTopics, function(currentTopic) {
return currentTopic.subTopicId === selectedSubTopicId;
})) {
console.log("selectedSubTopicId exists");
}
Sortie
selectedSubTopicId exists
Celui-ci a très bien fonctionné pour moi: cela aide lorsque vous avez plusieurs colonnes de données à vérifier, par exemple le titre, la catégorie et la description.
Pour vérifier si stringTosearch
se trouve dans l’une de ces colonnes de données, vous pouvez effectuer les opérations suivantes:
let searchResults = _.filter(yourArrayHere, (item) => {
return item.title.indexOf(stringTosearch) > -1
|| item.category.indexOf(stringTosearch) > -1
|| item.description.indexOf(stringTosearch) > -1;
});
Il renverra tout objet de votre tableau contenant stringTosearch
dans l'une des colonnes spécifiées.