2016-11-24 21 views
1

当我转到特定的路由时,我想运行$ http请求并将结果存储在服务中的变量中。从解析到设置服务中的属性值的方法(AngularJS)

所以当我进入'/ users'路由时,我在解析中运行UsersFactory.getUsers()方法。我希望此方法运行$ http请求,返回一些用户,并将这些用户放入UsersFactory中的属性“this.usersObj”。

我想这样做,而不是做一些比较常见的,如:

getUsers: function(UsersFactory) { return UsersFactory.getUsers();) 

,并得到在控制器

myApp.controller('UserController', function($scope, getUsers) { 
    $scope.users = getUsers; 
} 

所以这里的数据是我的尝试:

路径文件 ...

.when('/users', { 
    templateUrl: 'templates/page.html', 
    controller : 'MyCtrl', 
    resolve: { 
     getUsers: ['UsersFactory', function(UsersFactory) { 
      return UsersFactory.getUsers(); 

      // or just: UsersFactory.getUsers(); 
     }] 
     } 

... 

myApp.factory('UsersFactory', 
['$http', '$q', function($http, $q) { 

var self = this; 

var getUsers = function() { 
    function getUsersPromise() { 
     var deferred = $q.defer(); 

     $http({ 
      method: 'GET', 
      url: getFlashcardDecksURL 
     }) 
     .then(function successCallback(response) { 
      var users = response.data; 
      deferred.resolve(users); 
     }, function errorCallback() { 
      deferred.reject('error msg'); 
     }); 

     return deferred.promise; 
    } 

    getUsersPromise() 
    .then(function successCallback(users) { 
     self.usersObj = users; 
    }) 
    .catch(function errorCallback(errorMsg) { 
     self.errorMsg = errorMsg; 
    });  

}; 

var usersObj = []; 

return { 
    getUsers: getUsers, 
    usersObj: usersObj, 
} 

... 

我尝试不起作用。当我尝试访问我的控制器中的UsersFactory.usersObj时,它返回一个空数组。

回答

1

这个问题似乎是,你正在拉数据,但从来没有将承诺返回给解决方案,或从成功方法中返回用户。尝试改变:

getUsersPromise() 
.then(function successCallback(users) { 
    self.usersObj = users; 
}) 
.catch(function errorCallback(errorMsg) { 
    self.errorMsg = errorMsg; 
}); 

到:

return getUsersPromise() 
.then(function successCallback(users) { 
    self.usersObj = users; 
    return self.usersObj; 
}) 
.catch(function errorCallback(errorMsg) { 
    self.errorMsg = errorMsg; 
}); 
0

试试这个:

function getUsers() { 
    var deferred = $q.defer(); 

    $http({ 
    // Omitted 
    }) 
    .then(function(res) { 
    usersObj = res.data;   // Put in factory's property 
    deferred.resolve(res.data); 
    }, function(err) { 
    deferred.reject(err) 
    }); 

    return deferred.promise; 
} 

基本上,resolve将等待你的诺言得到解决。所以,只要返回承诺,其余的就会完成。