14

我在从填充到我的视图中的服务中获取数据时遇到问题。我有这样定义的服务

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 ,数据填充得很好,但是,如果我尝试从服务中调用数据,我什么也得不到。我知道查询是异步的,但我很难理解如何在返回数据后填充 $scope 变量。我可以使用 $rootscope 广播一个事件并在控制器中监听它,但这似乎不是完成此任务的正确方法。我非常感谢有关如何以正确方式执行此操作的任何建议。

4

3 回答 3

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`

}

这是对象引用的问题。

当您调用时,nukeService.getNukes()您将获得对对象的引用,a然后您的变量将$scope.nukes引用该内存位置。

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

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

于 2013-03-01T16:01:26.510 回答
9

这应该如下。正如 NickWiggill 的评论所提到的,如果我们不返回承诺,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;
    });

   }
于 2014-09-10T20:43:25.680 回答
4

我所做的是直接从服务公开数据,并有一个初始化这些数据的方法。这有什么问题?

服务:

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`
}
于 2015-01-28T17:30:42.027 回答