Ответ 1
Вопросы 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()
является асинхронным запросом.
Вы отправляете запрос своему сыну, THEN, когда вы завершаете загрузку браузера, он выполняет успех. НО сразу после отправки вашего запроса выполните цикл, используя 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");
});
});
});
Это должно работать.
Усиление
API $http основан на отложенных/обещающих API, выставленных $q оказание услуг. Хотя для простых шаблонов использования это не имеет большого значения, поскольку расширенное использование важно ознакомиться с этими API и гарантии, которые они предоставляют.
Вы можете взглянуть на отложенные/обещающие API, это важная концепция Angular для выполнения плавных асинхронных действий.