我试图在数组内循环一个数组通常是一个简单的任务。然而,我以前从来没有做过这个角度,它被证明是烦人的。我确信我错过了一些理解我应该做的事情以实现这一目标。范围内的cloneMealPlan项目是我正在尝试循环的项目,特别是有一系列的餐食和每餐内的一系列食谱。
当我在功能开始时直接登录到控制台时,它看起来都很好。但是,在第一个forEach中,我无法访问用餐中的食谱数组。如果您整体记录这顿饭,您可以在控制台中看到它,但不是当您尝试从餐内食物中提及时。
我也开放了一个更好的方法来实现这一点基本上我需要克隆一个MealPlan,其中有相当多的数组层(不停止在食谱中)我考虑移动所有这些到后端,只是在节点方面进行选择和插入,但不确定最佳做法。
现在我将整个MealPlan作为一个对象发送,然后在后端执行async eachSeries,每个部分都需要来自另一个的ID。
所以我的具体问题是为什么我不能从里面吃饭来获取食谱数据?
var cloneIngredientsLists = function() {
console.log($scope.cloneMealPlan);
console.log($scope.cloneMealPlan.meals);
console.log($scope.cloneMealPlan.meals[0].recipes);
angular.forEach($scope.cloneMealPlan.meals, function(meal) {
console.log(meal);
console.log(meal.recipes);
console.log(meal.recipes.length);
angular.forEach(meal.recipes, function(recipe) {
console.log(recipe);
return IngredientsListMapping
.query({id: recipe.id})
.$promise
.then(function(ingredientslists) {
$scope.ingredientslists = ingredientslists;
if (!recipe.ingredientslists) {
recipe.ingredientslists = [];
}
for (var k = 0; k < ingredientslists.length; k++) {
recipe.ingredientslists[k] = ingredientslists[k];
recipe.ingredientslists[k].list_name = ingredientslists[k].list_name + '- Clone';
if (!recipe.ingredientslists[k].ingredients) {
recipe.ingredientslists[k].ingredients = [];
}
}
});
});
});
};
答案 0 :(得分:1)
我认为您的问题是您正在for
循环中触发所有请求。在for
循环中触发请求不是一个好习惯,因为承诺不需要按照您创建的顺序完成。我要么将整个逻辑移到后端并尝试尽可能少地提出请求,要非常小心他们返回的承诺以及何时解决,或者你可以尝试扁平化承诺链。 Here是关于承诺系统如何在角度中起作用的非常好的文章。
修改:您是否可以尝试删除请求部分console.log(recipe)
?另外,我认为您不需要在forEach
循环中返回承诺。
答案 1 :(得分:0)
angular.forEach($scope.cloneMealPlan, function(item) {
angular.forEach(item.meals, function(second) {
angular.forEach(second, function(third) {
console.log(third.recipes);
});
});
});