2013-12-17 35 views
1

對不起,如果問題是從標題有點抽象。我會試着在這裏解釋它並提供一份帶有相關代碼的Gist。Angularjs:訪問範圍可變陣列,並計算平均

我有一個JSON API,它通過我搶AngularJS。這基本上是一個有幾項任務的項目。我想完成我的$ scope.projects變量(在我的項目控制器中)中的任務,並獲取每個任務中的所有'progress'值。然後我想計算它們的平均值以給出項目本身的整體進度並將其分配給$ scope變量以用於我的模板。

我不能似乎得到訪問的任務陣列無論我怎麼努力,我不知道爲什麼。所以我想在這裏問一些建議可能是一個不錯的選擇。任何幫助將不勝感激。

要點:https://gist.github.com/Tasemu/8002741

JS

App.controller('ProjectCtrl', ['$scope', 'Project', 'Task', '$routeParams', '$location', function($scope, Project, Task, $routeParams, $location) { 

    $scope.updateProjects = function() { 
     if (!$routeParams.id) { 
      Project.query(function(data) { 
      $scope.projects = data; 
      }); 
     } else { 
      $scope.projects = Project.get({id: $routeParams.id}) 
     } 
    }; 

    $scope.deleteProject = function(project) { 
     Project.delete({id: project.id}, function() { 
      $scope.updateProjects({id: project.id}); 
      $location.path('/'); 
     }); 
    }; 

    $scope.deleteTask = function(task) { 
     Task.delete({id: task.id}, function() { 
      $scope.updateProjects({id: task.id}); 
     }); 
    }; 

    $scope.updateProject = function(formData) { 
     $scope.projects.name = formData.name; 
     $scope.projects.description = formData.description; 
     $scope.projects.client = formData.client; 
     $scope.projects.due = formData.due; 
     $scope.projects.$update({id: formData.id}, function() { 
      $location.path('/'); 
     }); 
    }; 

    $scope.saveProject = function(project) { 
     Project.save({}, project, function() { 
      $location.path('/'); 
     }); 
    }; 

    $scope.updateProjects(); 

    $scope.progs = []; 

    for (var i = 0; i > $scope.projects.tasks.length; i++) { 
    progs.push($scope.projects.tasks.array[i].progress); 
    }; 

    }]); 

JSON

{ 
    id: 1, 
    name: "Project 1", 
    description: "this project", 
    client: "monty", 
    due: "2013-12-15", 
    tasks: [ 
    { 
     id: 2, 
     name: "Task 2", 
     progress: 22, 
     project_id: 1, 
     created_at: "2013-12-17T03:08:53.849Z", 
     updated_at: "2013-12-17T05:06:31.602Z" 
    }, 
    { 
     id: 1, 
     name: "Task 1", 
     progress: 75, 
     project_id: 1, 
     created_at: "2013-12-17T03:08:53.845Z", 
     updated_at: "2013-12-17T05:25:50.405Z" 
    } 
    ], 
    created_at: "2013-12-17T03:08:53.719Z", 
    updated_at: "2013-12-17T06:57:52.699Z" 
} 

JS

App.factory('Project', function($resource) { 
return $resource(
    '/api/v1/projects/:id.json', 
    {id: '@id'}, 
    { 
     update: { 
      method: 'PUT', 
      params: { id: '@id' }, 
      isArray: false 
     } 
    } 
); 
}); 

如果您需要了解更多信息,請不要猶豫,問!

+0

Project.query()的源代碼在哪裏?它使用$ http? – pinoyyid

+0

你是如何訪問它的? – kubuntu

+0

計算平均值的代碼在哪裏? – Sangram

回答

1

你必須進度計算延遲(線46〜48 project_controller.js),直到你的數據是滿載。將計算提取爲新方法,並在第6行的回調中以及在第9行必須創建的新回調中調用此新方法。

+0

謝謝你!我很感激幫助。 –

0

您正試圖在準備就緒之前訪問project.tasks。我建議你將計算包裝在一個函數中,並在檢索/更新項目時在成功回調中調用它。

$scope.updateProjects = function() { 
    if (!$routeParams.id) { 
     Project.query(function(data) { 
     $scope.projects = data; 
     $scope.calculateTasks(); 
     }); 
    } else { 
     $scope.projects = Project.get({id: $routeParams.id}) 
    } 
}; 

... 
$scope.calculateTasks = function() { 
    $scope.progs = []; 
    for (var i = 0; i > $scope.projects.tasks.length; i++) { 
     $scope.progs.push($scope.projects.tasks.array[i].progress); 
    }; 
} 
$scope.updateProjects(); 
+0

感謝您的幫助伴侶。我幾乎從中得到它,我只需要添加另一個回調。再次感謝。 :) –