Запитання 1 і 2
Отже, перший параметр - це об'єкт, який слід повторити. Це може бути масив або об’єкт. Якщо це такий об'єкт:
var values = {name: 'misko', gender: 'male'};
Кутовий візьме кожне значення по одному, перше - ім’я, друге - стать.
Якщо ваш об'єкт для повторення - це масив (також можливий), такий:
[{ "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
все ще не визначено.