我正在浏览 forEach
loop
中的 AngularJS
。有几点我不明白。
angular.forEach($scope.data, function(value, key){});
PS: 我试图在没有参数的情况下运行这个函数,但它不起作用。
这是我的
json
:[
{
"Name": "Thomas",
"Password": "thomasTheKing"
},
{
"Name": "Linda",
"Password": "lindatheQueen"
}
]
我的
JavaScript
文件: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");
});
});
另一个问题 :为什么上面的函数没有进入 if 条件并在控制台中打印“username is thomas”?
最佳答案
问题 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
所以键是键的字符串值,值是......值。您可以使用 key 访问您的值,如下所示:
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]
那么 value 是您的对象(集合),而 key 是您的数组的索引,因为:
[{ "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");
});
});
});
这应该有效。
更深入
你可以看看 deferred/promise APIs ,它是 Angular 的一个重要概念,使异步操作流畅。
关于angularjs - angularjs 中的 foreach 循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29953198/