Domande 1 e 2
Quindi, fondamentalmente, il primo parametro è l'oggetto su cui iterare. Può essere un array o un oggetto. Se è un oggetto come questo:
var values = {name: 'misko', gender: 'male'};
Angular prenderà ogni valore uno per uno, il primo è il nome, il secondo è il genere.
Se il tuo oggetto su cui iterare è un array (anche possibile), come questo:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
Angular.forEach prenderà uno per uno partendo dal primo oggetto, quindi dal secondo oggetto.
Per ciascuno di questi oggetti, li prenderà quindi uno per uno ed eseguirà un codice specifico per ogni valore. Questo codice è chiamato funzione iteratore . forEach è intelligente e si comporta in modo diverso se si utilizza un array di una raccolta. Ecco alcuni esempi:
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
Quindi la chiave è il valore stringa della tua chiave e il valore è ... il valore. Puoi usare la chiave per accedere al tuo valore in questo modo:obj['name'] = 'John'
Se questa volta visualizzi un array, come questo:
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]
Quindi il valore è il tuo oggetto (collezione) e la chiave è l'indice del tuo array poiché:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
// is equal to
{0: { "Name" : "Thomas", "Password" : "thomasTheKing" },
1: { "Name" : "Linda", "Password" : "lindatheQueen" }}
Spero che risponda alla tua domanda. Ecco un JSFiddle per eseguire del codice e testarlo se lo desideri: http://jsfiddle.net/ygahqdge/
Debug del codice
Il problema sembra derivare dal fatto che $http.get()
è una richiesta asincrona.
Mandi una query a tuo figlio, POI quando il browser termina il download, viene eseguito con successo. MA subito dopo aver inviato la tua richiesta esegui un loop utilizzando angular.forEach
senza attendere la risposta del tuo JSON.
È necessario includere il ciclo nella funzione di successo
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");
});
});
});
Questo dovrebbe funzionare.
Andando più in profondità
L' API $ http si basa sulle API differite / promesse esposte dal servizio $ q. Sebbene per modelli di utilizzo semplici ciò non sia molto importante, per l'utilizzo avanzato è importante acquisire familiarità con queste API e le garanzie che forniscono.
Puoi dare un'occhiata alle API differite / promesse , è un concetto importante di Angular per eseguire azioni asincrone fluide.
success
che accada il tuo$http.get()
, quindi, quandoangular.forEach()
accade,$scope.data
è ancora indefinito.