从服务AngularJS加载数据(AngularJS Load Data from Service)

2019-07-20 19:11发布

我有从填充到我的观点的服务的问题中获取数据。 我有一个服务定义为这样的

app.factory('nukeService', function($rootScope, $http) {
    var nukeService = {};

    nukeService.nuke = {};

    //Gets the list of nuclear weapons
    nukeService.getNukes = function() {
        $http.get('nukes/nukes.json')
            .success(function(data) {
                nukeService.nukes = data;
            });

        return nukeService.nukes;
    };

    return nukeService;
});

和我的控制器

function NavigationCtrl($scope, $http, nukeService){



    /*$http.get('nukes/nukes.json').success(function(data) {
        $scope.nukes = data;
    });*/

    $scope.nukes = nukeService.getNukes();

}

如果我使用$ http.get来自控制器的数据填充正常,但是,如果我尝试从服务调用数据,我什么也没得到。 据我所知,查询是异步的,但我有一个很难理解如何填充$范围变量一旦返回的数据。 我可以用$ rootscope广播一个事件,并在控制器听它,但是这似乎并不像做到这一点的正确方法。 我真的很感激如何做到这一点的正确方法的任何建议。

Answer 1:

我想这应该解决您的问题

app.factory('nukeService', function($rootScope, $http) {
    var nukeService = {};

    nukeService.data = {};

    //Gets the list of nuclear weapons
    nukeService.getNukes = function() {
        $http.get('nukes/nukes.json')
            .success(function(data) {
                nukeService.data.nukes = data;
            });

        return nukeService.data;
    };

    return nukeService;
});

function NavigationCtrl($scope, $http, nukeService){

    $scope.data = nukeService.getNukes();

    //then refer to nukes list as `data.nukes`

}

这是对象引用的问题。

当你调用nukeService.getNukes()你得到一个对象的引用a那么你的变量$scope.nukes是指该内存位置。

当您设置远程服务器调用后nukeService.nukes = data; 你是不是改变对象a ,而不是你正在改变nukeService.nukes从引用对象a反对b 。 但是,你的$scope.nukes不知道该重新分配,它仍然指向对象的a

我在这种情况下的解决方案是通过一个对象a与属性data ,然后仅改变数据属性,而不是改变参照a



Answer 2:

这应该是如下。 正如NickWiggill的评论中提到,未定义将被分配到nukeService.data如果我们不返回的承诺。

app.factory('nukeService', function($rootScope, $http) {
    var nukeService = {};
    //Gets the list of nuclear weapons
    nukeService.getNukes = function() {
       return $http.get('nukes/nukes.json');
    };

    return nukeService;
});


  function NavigationCtrl($scope, $http, nukeService){
     nukeService.getNukes().then(function(response){

        $scope.data = response.data;
    });

   }


Answer 3:

我要做的就是,我直接从服务公开的数据,并且具有初始化这个数据的方法。 有什么不对呢?

服务:

app.factory('nukeService', function($scope, $http) {
    var data = {};
    data.nukes = [];

    //Gets the list of nuclear weapons
    var getNukes = function() {
        $http.get('nukes/nukes.json').success(function(data) {
                data.nukes = data;
        });
    };

    // Fill the list with actual nukes, async why not.
    getNukes();

    return {
        data : data
        // expose more functions or data if you want
    };
});

控制器:

function NavigationCtrl($scope, nukeService){
     $scope.data = nukeService.data;
     //then refer to nukes list as `$scope.data.nukes`
}


文章来源: AngularJS Load Data from Service