服务没有从.json文件中提供控制器数据?

时间:2014-09-05 10:55:47

标签: javascript json angularjs

我想使用carData.json从服务器获取AngularJS文件。

以下是我的结构:

我有一个services.js文件(在js forlder内),我保留了所有servicesfactories。以下是我用来从服务器获取factory文件的carData.json

carApp.factory('getAllCars', function($http){
    return {
        get: function() {
            return $http.get('data/carData.json');
        }
    };
});

我还有一个CarsByReviewCtrl控制器,它将carData.json文件用于其目的:

carApp.controller("CarsByReviewCtrl", function($scope, getAllCars) {
    getAllCars.get().success(function(data){
        $scope.allCars = data;
    }).error(function(data, status, headers, config) {
      alert("AJAX failed")
    });
    $scope.carList = [];
    console.log($scope.allCars);
    ...

最后,这是我.html文件的末尾,我传递了这些.js文件。 (我在html文件中间调用了控制器)

        <script type="text/javascript" src="js/controllers/CarsByReviewCtrl.js"></script>
        <script type="text/javascript" src="js/services.js"></script>
    </body>
</html>

现在,如果我运行我的应用程序并打开控制台,我将得到undefined的输出,而不是我从服务器获得的javascript对象。

我做错了什么,我该如何解决?

2 个答案:

答案 0 :(得分:1)

问题是:console.log($scope.allCars)在成功处理程序运行之前运行。 您可以将代码更改为:

carApp.controller("CarsByReviewCtrl", function($scope, getAllCars) {
    getAllCars.get().success(function(data){
        $scope.allCars = data;
        console.log($scope.allCars);
    }).error(function(data, status, headers, config) {
      alert("AJAX failed")
    });
    $scope.carList = [];

    ...

答案 1 :(得分:1)

您正在尝试在解析HTTP请求之前打印$scope.allCars的内容。

为您的代码添加了一些注释,以便解释您应该如何阅读它:

carApp.controller("CarsByReviewCtrl", function($scope, getAllCars) {
    // first line of JS to be invoked
    getAllCars.get().success(function(data){
       // this will be executed later in time, after receiving the HTTP response (case success)
       $scope.allCars = data;
    }).error(function(data, status, headers, config) {
       // this will be executed later in time, after receiving the HTTP response (case error)
       alert("AJAX failed")
    });

    // this will be executed immediately after the previous JS line: getAllCars.get()
    $scope.carList = [];

    // this will be executed immediately after the previous JS line
    console.log($scope.allCars);