繁体   English   中英

强制AngularJS服务在加载控制器之前返回数据

[英]Force AngularJS service to return data before loading controller

我在Angular中有一个服务,它使用我的API获取用户信息并将其提供给我的控制器。 它的设置如下:

angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'ngResource', 'infinite-scroll', 'ui.bootstrap', 'ngCookies', 'seo'])
  .service('userInfo', function($http, $cookies){
    $http.get('/api/users/' + $cookies.id).
    success(function(data) {
      var userInfo = data.user[0];

      return userInfo;
    });
  }). // other stuff comes after this

在我的控制器中,我包括它:

function userProfile($scope, $cookies, userInfo, $http, $resource, $routeParams, $rootScope){
    $scope.user = userInfo;
    console.log('user info is')
    console.log(userInfo);

这没有返回数据,而如果我在控制器本身放置相同的服务功能,它返回就好了。 我在这里错过了什么? 从来没有在Angular中使用DI / Services,因此在某处可能是一个简单的错误。

我需要确保服务在控制器加载之前返回数据。 如何实现这一目标

你可以让工厂返回这样的承诺:

angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'ngResource', 'infinite-scroll', 'ui.bootstrap', 'ngCookies', 'seo'])
    .service('userInfo', function ($http, $cookies) {
    var promise = $http.get('/api/users/' + $cookies.id).
    success(function (data) {
        var userInfo = data.user[0];
        return userInfo;
    });
    return promise;
}) // other stuff comes after this

在你的控制器中,做

function userProfile($scope, $cookies, userInfo, $http, $resource, $routeParams, $rootScope){
    userInfo.then(function(data){
        $scope.user = data;
    });
}

这可以保证无论何时使用该服务,它总是同步为您提供数据,您不必在加载控制器之前加载任何数据。

您的userInfo服务必须返回$http返回的承诺。 然后将该承诺注入您的控制器,一旦承诺成功解决,视图将立即更新。


如果您不希望在userInfo结算之前完全呈现视图,则应在路由上设置resolve属性,并在其中注入您的服务:

$routeProvider.when('/profile', {
    templateUrl: 'profile',
    controller: userProfile,
    resolve: {
         userInfoData: function ($q, userInfo) {
             return userInfo;
         }
    }
});

然后将userInfoData注入控制器以代替userInfo服务。

您可以将资源对象分配给您的变量,如返回$ http.get(url)

我遇到了同样的问题,我必须使用$ resource将数据加载到服务中并将数据转换为控制器$ scope。 我不想直接返回promise,然后在控制器中使用一个解析器(如@zsong写的那样),但是要将所有的魔法都用于服务,并使用能力直接将一个promise分配给$ scope作为@Joseph西尔伯指出,所以这就是我所做的:

return function($scope){promise.then(function(data){$scope.user = data})};

并在控制器中使用它像这样:

userInfo($scope);

没有太大的改进,但它让我在我的控制器中有更清晰的语法,希望它甚至可以帮助三年后!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM