1

我声明了以下服务:

app.factory('data', ['$http', function ($http) {

        var dataRecords = {};

        //Retrieve the entries from the data file and categorize them according
        //to the information types located in the overview page
        $http.get('data.json')
            .success(function (records) {
                    //Fill the dataRecords variable
        });

        return {
            get: function () {
                return dataRecords;
            },
            setNew: function (newRecords) {
                dataRecords = newRecords;
            }
        };
    }]);

可以看出,使用$http我从 data.json 文件中获取数据。现在我的问题是,当我调用get数据服务的方法时,即使 data.json 不为空,我也会返回空记录。

据我了解,$http.get()会延迟返回数据,因此当我调用 get 时,它仍未填充,因此我得到空值。

如何调用服务并确保在从服务中获取数据时填充数据?

4

2 回答 2

1

你这样做是不对的。我认为正确的方法是:

app.factory('MyService', ['$http', function ($http) {

    var dataRecords = {};

    return {
        get: function (success) {
            $http.get('data.json').success(success) {});
        }
    };
}]);

并称它为

 MyService.get(function(response) {
      //on success
 });

因此,您希望使用 http.get 初始化您的服务。这不是一件容易的事。但是,关于 SO 已经存在这样的问题:AngularJS : Initialize service with asynchronous data


但是,您也可以这样做:

app.factory('MyService', ['$http', function ($http) {

    var myService = {};

    myService.get = function () {
        return myService.records;
    }

    myService.load = function(){
        $http.get('data.json').success(function(response){
             myService.records = response;
             return myService.records;
        }) {});
    }

    return myService;
}]);

在控制器中:

if(typeof MyService.get() === 'undefined'){
    $scope.records = MyService.load();
}

在控制器初始化时,数据将被提取一次。

于 2013-05-26T08:12:04.653 回答
1

以@artowrkad 的示例为例,如果您只希望它获取一次且仅一次,只需实现逻辑以不再获取它,如下所示:

app.factory('MyService', ['$http', function ($http) {

    var dataRecords = false;

    return {
        get: function (successCallback) {
            if(!dataRecords){
                $http.get('data.json').success(function(data){
                    dataRecords = data;
                    successCallback(data);
                ));
            }
            else{
                successCallback(dataRecords);
            }
        }
    };
}]);

你甚至可以改进它,如果它正在运行 $http.get,而你第二次调用等待,然后在它完成时进行你需要的回调。

于 2013-05-26T14:44:10.460 回答