嵌套的angular.forEach问题

时间:2015-01-06 23:51:31

标签: angularjs node.js

我试图在数组内循环一个数组通常是一个简单的任务。然而,我以前从来没有做过这个角度,它被证明是烦人的。我确信我错过了一些理解我应该做的事情以实现这一目标。范围内的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 = [];
              }

            }


          });
        });
      });
  };

2 个答案:

答案 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);
        });
    });
});