Ja jechałem przez forEach
loop
IN AngularJS
. Jest kilka punktów, których nie rozumiem.
- Jaki jest pożytek z funkcji iteratora? Czy można się bez niego obejść?
- Jakie jest znaczenie klucza i wartości, jak pokazano poniżej?
angular.forEach($scope.data, function(value, key){});
PS: Próbowałem uruchomić tę funkcję bez argumentów i nie działa.
Oto moje json
:
[
{
"Name": "Thomas",
"Password": "thomasTheKing"
},
{
"Name": "Linda",
"Password": "lindatheQueen"
}
]
Mój JavaScript
plik:
var app = angular.module('testModule', []);
app.controller('testController', 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");
});
});
Kolejne pytanie : dlaczego powyższa funkcja nie włącza warunku warunkowego i wypisuje w konsoli "nazwa użytkownika to thomas"?
success
aż to$http.get()
, co sięangular.forEach()
wydarzy,$scope.data
jest nadal nieokreślone.Odpowiedzi:
Pytania 1 i 2
Zasadniczo pierwszym parametrem jest obiekt do iteracji. Może to być tablica lub obiekt. Jeśli jest to taki obiekt:
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:
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:
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:
Zatem wartość to twój obiekt (kolekcja), a klucz to indeks twojej tablicy, ponieważ:
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
To powinno działać.
Idąc głębiej
Możesz przyjrzeć się odroczonym / obiecanym interfejsom API . Ważną koncepcją Angular jest wykonywanie płynnych asynchronicznych akcji.
źródło
success
ierror
został wycofany . Sugeruje się użyciethen
metody zamiastsuccess
. Teraz @Colin, wyjdź i odpowiedz na kilka pytań, aby uzyskać 50 powtórzeń! : Pmusisz użyć zagnieżdżonych pętli angular.forEach dla JSON, jak pokazano poniżej:
źródło
values.forEach(object => console.log(
$ {object.name}: $ {object.password}))
.angular.forEach()
Będzie iterację Twojegojson
obiektu.Pierwsza iteracja,
Druga iteracja,
Aby uzyskać wartość swojego
name
, możesz użyćvalue.name
lubvalue["name"]
. To samo z twoimpassword
, używaszvalue.password
lubvalue["password"]
.Poniższy kod da ci to, czego chcesz:
źródło
Zmień linię na to
źródło
W Angular 7 pętla for wygląda jak poniżej
źródło