Preguntas 1 y 2
Entonces, básicamente, el primer parámetro es el objeto sobre el que iterar. Puede ser una matriz o un objeto. Si es un objeto como este:
var values = {name: 'misko', gender: 'male'};
Angular tomará cada valor uno por uno, el primero es el nombre, el segundo es el género.
Si su objeto para iterar es una matriz (también es posible), así:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
Angular.forEach tomará uno por uno comenzando por el primer objeto, luego el segundo objeto.
Para cada uno de estos objetos, los tomará uno por uno y ejecutará un código específico para cada valor. Este código se llama función de iterador . forEach es inteligente y se comporta de manera diferente si está utilizando una matriz de una colección. A continuación se muestra un ejemplo:
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
Entonces, la clave es el valor de cadena de su clave y el valor es ... el valor. Puede usar la clave para acceder a su valor de esta manera:obj['name'] = 'John'
Si esta vez muestra una 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]
Entonces el valor es su objeto (colección), y la clave es el índice de su matriz ya que:
[{ "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 tu pregunta. Aquí hay un JSFiddle para ejecutar algún código y probarlo si lo desea: http://jsfiddle.net/ygahqdge/
Depurando tu código
El problema parece provenir del hecho de que $http.get()
es una solicitud asincrónica.
Envías una consulta sobre tu hijo, ENTONCES , cuando el navegador termina de descargarlo, se ejecuta correctamente. PERO justo después de enviar su solicitud, realiza un ciclo usando angular.forEach
sin esperar la respuesta de su JSON.
Debe incluir el bucle en la función de éxito
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");
});
});
});
Esto debería funcionar.
Yendo mas profundo
La API $ http se basa en las API diferidas / promesas expuestas por el servicio $ q. Mientras que para patrones de uso simples esto no importa mucho, para uso avanzado es importante familiarizarse con estas API y las garantías que brindan.
Puede echar un vistazo a las API diferidas / prometidas , es un concepto importante de Angular para realizar acciones asincrónicas sin problemas.
success
que suceda su$http.get()
, por lo tanto, cuandoangular.forEach()
suceda,$scope.data
aún no está definido.