Questions 1 et 2
Donc, fondamentalement, le premier paramètre est l'objet sur lequel itérer. Cela peut être un tableau ou un objet. S'il s'agit d'un objet comme celui-ci:
var values = {name: 'misko', gender: 'male'};
Angular prendra chaque valeur une par une, la première étant le nom, la seconde le sexe.
Si votre objet sur lequel itérer est un tableau (également possible), comme ceci:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
Angular.forEach prendra un par un en commençant par le premier objet, puis le deuxième objet.
Pour chacun de ces objets, il va donc les prendre un par un et exécuter un code spécifique pour chaque valeur. Ce code est appelé la fonction itérateur . forEach est intelligent et se comporte différemment si vous utilisez un tableau d'une collection. Voici quelques exemples:
var obj = {name: 'misko', gender: 'male'};
var log = [];
angular.forEach(obj, function(value, key) {
console.log(key + ': ' + value);
});
// it will log two iteration like this
// name: misko
// gender: male
La clé est donc la valeur de chaîne de votre clé et la valeur est ... la valeur. Vous pouvez utiliser la clé pour accéder à votre valeur comme ceci:obj['name'] = 'John'
Si cette fois vous affichez un tableau, comme ceci:
var values = [{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }];
angular.forEach(values, function(value, key){
console.log(key + ': ' + value);
});
// it will log two iteration like this
// 0: [object Object]
// 1: [object Object]
Alors la valeur est votre objet (collection) et la clé est l'index de votre tableau puisque:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
// is equal to
{0: { "Name" : "Thomas", "Password" : "thomasTheKing" },
1: { "Name" : "Linda", "Password" : "lindatheQueen" }}
J'espère que cela répondra à votre question. Voici un JSFiddle pour exécuter du code et tester si vous le souhaitez: http://jsfiddle.net/ygahqdge/
Déboguer votre code
Le problème semble venir du fait qu'il $http.get()
s'agit d'une requête asynchrone.
Vous envoyez une requête sur votre fils, PUIS lorsque votre navigateur termine le téléchargement, il exécute le succès. MAIS juste après avoir envoyé votre demande, vous effectuez une boucle en utilisant angular.forEach
sans attendre la réponse de votre JSON.
Vous devez inclure la boucle dans la fonction de réussite
var app = angular.module('testModule', [])
.controller('testController', ['$scope', '$http', function($scope, $http){
$http.get('Data/info.json').then(function(data){
$scope.data = data;
angular.forEach($scope.data, function(value, key){
if(value.Password == "thomasTheKing")
console.log("username is thomas");
});
});
});
Cela devrait fonctionner.
Aller plus profondément
L' API $ http est basée sur les API différées / promises exposées par le service $ q. Alors que pour les modèles d'utilisation simples, cela n'a pas beaucoup d'importance, pour une utilisation avancée, il est important de vous familiariser avec ces API et les garanties qu'elles offrent.
Vous pouvez jeter un œil aux API différées / promises , c'est un concept important d'Angular pour faire des actions asynchrones fluides.
success
vôtre se produise$http.get()
, le moment oùangular.forEach()
cela se produit$scope.data
n'est donc toujours pas défini.