Angularjs:访问范围变量数组并计算平均值

Angularjs: accessing scope variable array and calculating average

本文关键字:计算 平均值 数组 变量 访问 范围 Angularjs      更新时间:2023-09-26

抱歉,如果问题与标题有点抽象。我将尝试在这里解释它,并提供带有相关代码的要点。

我有一个通过AngularJS获取的JSON api。这基本上是一个具有多个任务的项目。我想遍历我的 $scope.projects 变量(在我的项目控制器中)中的任务,并获取每个任务中的所有"进度"值。然后我想计算它们的平均值,以给出项目本身的整体进度,并将其分配给要在模板中使用的$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);
    };
    }]);

杰伦

{
  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
        }
    }
);
});

如果您需要更多信息,请随时询问!

您必须延迟进度计算(project_controller.js中的第 46 行到 48 行),直到数据完全加载。将计算提取到一个新方法中,并在第 6 行的回调中调用此新方法,并在必须在第 9 行创建的新回调中调用此新方法。

您正在尝试在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();