Pytania 1 i 2
Zasadniczo pierwszym parametrem jest obiekt do iteracji. Może to być tablica lub obiekt. Jeśli jest to taki obiekt:
var values = {name: 'misko', gender: 'male'};
Angular przyjmie każdą wartość po kolei, pierwsza to nazwa, druga to płeć.
Jeśli twoim obiektem do iteracji jest tablica (również możliwa), na przykład:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
Angular.forEach będzie zajmować się pojedynczo, zaczynając od pierwszego obiektu, a następnie drugiego obiektu.
Dla każdego tego obiektu będzie więc pobierał je jeden po drugim i wykonywał określony kod dla każdej wartości. Ten kod jest nazywany funkcją iteratora . forEach jest inteligentny i zachowuje się inaczej, jeśli używasz tablicy kolekcji. Oto kilka przykładów:
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
Więc klucz to ciąg znaków twojego klucza, a wartość to ... wartość. Możesz użyć klucza, aby uzyskać dostęp do swojej wartości w następujący sposób:obj['name'] = 'John'
Jeśli tym razem wyświetlisz tablicę, taką jak ta:
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]
Zatem wartość to twój obiekt (kolekcja), a klucz to indeks twojej tablicy, ponieważ:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
// is equal to
{0: { "Name" : "Thomas", "Password" : "thomasTheKing" },
1: { "Name" : "Linda", "Password" : "lindatheQueen" }}
Mam nadzieję, że to odpowiedź na twoje pytanie. Oto JSFiddle do uruchomienia kodu i przetestowania, jeśli chcesz: http://jsfiddle.net/ygahqdge/
Debugowanie kodu
Problem wydaje się wynikać z faktu, $http.get()
że żądanie jest asynchroniczne.
Wysłać zapytanie o swojego syna, WTEDY , kiedy koniec przeglądarka pobierając go wykonywał sukces. ALE zaraz po wysłaniu zapytania wykonujesz pętlę, angular.forEach
nie czekając na odpowiedź swojego JSON.
Musisz uwzględnić pętlę w funkcji sukcesu
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");
});
});
});
To powinno działać.
Idąc głębiej
$ Http API jest oparty na odroczony / obiecują API odsłonięte przez serwis $ q. Podczas gdy w przypadku prostych wzorców użycia nie ma to większego znaczenia, w przypadku zaawansowanego użytkowania ważne jest, aby zapoznać się z tymi interfejsami API i gwarancjami, które zapewniają.
Możesz przyjrzeć się odroczonym / obiecanym interfejsom API . Ważną koncepcją Angular jest wykonywanie płynnych asynchronicznych akcji.
success
aż to$http.get()
, co sięangular.forEach()
wydarzy,$scope.data
jest nadal nieokreślone.