AngularJS从服务加载数据

jam*_*uir 14 javascript service load angularjs

我在填充到我的视图中的服务中获取数据时遇到问题.我有一个如此定义的服务

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;
});
Run Code Online (Sandbox Code Playgroud)

和我的控制器

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



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

    $scope.nukes = nukeService.getNukes();

}
Run Code Online (Sandbox Code Playgroud)

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

Aru*_*hny 28

我认为这应该可以解决你的问题

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`

}
Run Code Online (Sandbox Code Playgroud)

这是对象引用的问题.

当您调用时,nukeService.getNukes()您正在获取对象的引用,a那么您的变量将$scope.nukes引用该内存位置.

在设置远程服务器调用之后,nukeService.nukes = data;您没有更改对象,a而是nukeService.nukes从引用对象更改a为对象b.但你$scope.nukes不知道这个重新分配,它仍然指向对象a.

在这种情况下,我的解决方案是传递一个a带有属性的对象,data然后只更改数据属性而不是更改引用a

  • 这并不考虑异步加载 - `$ scope.data`返回null,因为`getNukes()`立即返回而不等待`$ http`的结果. (8认同)
  • @arcone从广义上讲,你需要返回`$ http.get`返回的promise,而不是从`nukeService.getNukes`返回`.data`(此时为`null`).在您的调用代码中,您必须使用`promise.then`来提供一个回调,一旦promise实际解析,它将继续您的代码流. (3认同)

Gan*_*ade 9

这应该如下.正如NickWiggill的评论所提到的,如果我们不返回promise,undefined将被分配给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;
    });

   }
Run Code Online (Sandbox Code Playgroud)