Perguntas 1 e 2
Então, basicamente, o primeiro parâmetro é o objeto para iterar. Pode ser uma matriz ou um objeto. Se for um objeto como este:
var values = {name: 'misko', gender: 'male'};
Angular pegará cada valor um por um, o primeiro é o nome, o segundo é o gênero.
Se o seu objeto para iterar for uma matriz (também possível), assim:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
Angular.forEach pegará um por um, começando pelo primeiro objeto e, em seguida, pelo segundo objeto.
Para cada um deste objeto, ele os pegará um por um e executará um código específico para cada valor. Esse código é chamado de função iteradora . forEach é inteligente e se comporta de maneira diferente se você estiver usando um array de uma coleção. Aqui está algum exemplo:
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
Portanto, a chave é o valor da string de sua chave e o valor é ... o valor. Você pode usar a chave para acessar seu valor assim:obj['name'] = 'John'
Se desta vez você exibir uma matriz, como esta:
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]
Portanto, o valor é o seu objeto (coleção) e a chave é o índice da sua matriz desde:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
// is equal to
{0: { "Name" : "Thomas", "Password" : "thomasTheKing" },
1: { "Name" : "Linda", "Password" : "lindatheQueen" }}
Espero que responda a sua pergunta. Aqui está um JSFiddle para executar algum código e testar se você quiser: http://jsfiddle.net/ygahqdge/
Depurando seu código
O problema parece vir do fato de $http.get()
ser uma solicitação assíncrona.
Você manda uma consulta sobre seu filho, ENTÃO ao finalizar o navegador e baixá-lo executa com sucesso. MAS logo após enviar sua requisição você executa um loop usando angular.forEach
sem esperar a resposta do seu JSON.
Você precisa incluir o loop na função de sucesso
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");
});
});
});
Isso deve funcionar.
Indo mais fundo
A API $ http é baseada nas APIs adiadas / prometidas expostas pelo serviço $ q. Enquanto para padrões de uso simples isso não importa muito, para uso avançado é importante familiarizar-se com essas APIs e as garantias que elas fornecem.
Você pode dar uma olhada nas APIs deferidas / prometidas ; é um conceito importante do Angular para tornar as ações assíncronas suaves.
success
que aconteça de sua$http.get()
, assim, quandoangular.forEach()
acontece,$scope.data
ainda está indefinido.