如何在$ http.get之外获取变量值?

时间:2015-01-27 11:26:07

标签: angularjs angularjs-scope

angularjs新手。我有一个简单的控制器,它使用$http.get读取json文件。在get内,我正在为变量$scope.testTotal分配一些值。但是在退出$http.get时它们会恢复为默认值。令人困惑的是,当我将整个对象记录到控制台时,我可以看到值,但是当记录特定值时,它显示为零。它可能是变量范围问题还是执行顺序问题?

'use strict';
var app = angular.module("myApp", [ 'ngRoute']);

app.controller("SummaryController", ['$scope', '$http', function ($scope, $http) {

    $scope.testTotal = {
        executionStatus: { total: 0, passed: 0, failed: 0, duration: 0 }
    };

    $http.get('dummy.json').success(function (data) {
        $scope.data = data;
        angular.forEach($scope.data, function (i) {
            $scope.testTotal.executionStatus.passed += i.passed;
            $scope.testTotal.executionStatus.failed += i.failed;
        });
    });

    console.log($scope.testTotal); //I can see nested object with assigned values
    console.log($scope.testTotal.executionStatus.passed); //Vanished. Shows default value zero
}]);

dummy.json有

[
    {"passed": 30, "failed": 12},
    {"passed": 10, "failed": 8}
]

修改

我创建了http://plnkr.co/edit/GlrrB0DkoAXCGpVsC2La。我的问题的目标是:从嵌套的json文件中读取值(同步或异步),将其分配给变量/对象并使用它来制作图表。不幸的是,我无法访问我读过的值。

2 个答案:

答案 0 :(得分:0)

$ http.get调用是异步的。在最后两个console.log()行正在执行时,您已发送了一个AJAX请求,但尚未收到响应。

收到后,将执行传递给success()的回调函数。只有这样,您才能知道新值并访问数据:

$http.get('dummy.json').success(function (data) {
    $scope.data = data;
    angular.forEach($scope.data, function (i) {
        $scope.testTotal.executionStatus.passed = 90;
        $scope.testTotal.executionStatus.failed = 25;
        $scope.testTotal.executionStatus.total = 115;
    });
    console.log($scope.testTotal); 
    console.log($scope.testTotal.executionStatus.passed);
});

请注意,forEach循环没有多大意义:您在循环中为每个$scope.testTotal.executionStatus属性分配一个常量值。为什么在每次迭代时都使用循环?

答案 1 :(得分:0)

$scope.testTotal.executionStatus.passed是一个值,它会立即记录下来。由于$http.get是异步的,因此它是原始值。

$scope.testTotal是包含其他对象的对象。要查看passed的值,您必须打开对象树。它不是在打印passed之前的那一刻,并且在那一刻它已经被分配了新值。