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文件中读取值(同步或异步),将其分配给变量/对象并使用它来制作图表。不幸的是,我无法访问我读过的值。
答案 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
之前的那一刻,并且在那一刻它已经被分配了新值。