Вопросы 1 и 2
Итак, по сути, первый параметр - это объект для итерации. Это может быть массив или объект. Если это такой объект:
var values = {name: 'misko', gender: 'male'};
Angular будет принимать каждое значение одно за другим, первое - имя, второе - пол.
Если ваш объект для итерации представляет собой массив (также возможно), например:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
Angular.forEach будет принимать один за другим, начиная с первого объекта, затем второго объекта.
Для каждого из этих объектов он будет брать их один за другим и выполнять определенный код для каждого значения. Этот код называется функцией итератора . forEach умен и ведет себя иначе, если вы используете массив коллекции. Вот пример:
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
Итак, ключ - это строковое значение вашего ключа, а значение - это ... значение. Вы можете использовать ключ для доступа к своему значению следующим образом:obj['name'] = 'John'
Если на этот раз вы отобразите массив, например:
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]
Итак, значение - это ваш объект (коллекция), а ключ - это индекс вашего массива, поскольку:
[{ "Name" : "Thomas", "Password" : "thomasTheKing" },
{ "Name" : "Linda", "Password" : "lindatheQueen" }]
// is equal to
{0: { "Name" : "Thomas", "Password" : "thomasTheKing" },
1: { "Name" : "Linda", "Password" : "lindatheQueen" }}
Надеюсь, он ответит на ваш вопрос. Вот JSFiddle для запуска кода и тестирования, если хотите: http://jsfiddle.net/ygahqdge/
Отладка вашего кода
Проблема, похоже, связана с тем, $http.get()
что это асинхронный запрос.
Вы отправляете запрос своему сыну, ТОГДА, когда браузер заканчивает загрузку, он выполняет успешно. НО сразу после отправки вашего запроса вы выполняете цикл, angular.forEach
не дожидаясь ответа вашего JSON.
Вам нужно включить цикл в функцию успеха
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");
});
});
});
Это должно работать.
Идти глубже
$ HTTP API основан на отложенном / пообещать API , доступный в $ д службой. Хотя для простых шаблонов использования это не имеет большого значения, для расширенного использования важно ознакомиться с этими API и гарантиями, которые они предоставляют.
Вы можете взглянуть на отложенные / обещающие API , это важная концепция Angular для создания плавных асинхронных действий.
success
ваше$http.get()
, поэтому, когда этоangular.forEach()
произойдет,$scope.data
все еще не определено.