【问题标题】:Angularjs: accessing scope variable array and calculating averageAngularjs:访问范围变量数组并计算平均值
【发布时间】:2013-12-17 10:13:18
【问题描述】:

对不起,如果问题与标题有点抽象。我将尝试在这里解释它并提供一个带有相关代码的 Gist。

我有一个通过 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);
    };

    }]);

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

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

【问题讨论】:

  • Project.query() 的源代码在哪里?是在使用 $http 吗?
  • 你是如何访问它的?
  • 计算平均值的代码在哪里?
  • 嗨,我现在将使用我的查询代码更新 Gist。我正在为此使用 $resource。
  • 我没有包含我的代码来尝试访问它,因为无论如何我几乎都是瞎子走来走去。我尝试使用 for 循环遍历它们,并将“进度”值推送到新数组。它只是在控制台中返回了“无法读取未定义的属性 'length'”错误。我现在也会用我的循环更新 Gist。谢谢大家!

标签: javascript arrays angularjs average


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢朋友的帮助。我几乎从中得到了它,我只需要添加另一个回调。再次感谢。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多