34

API を使用してユーザー情報を取得し、それをコントローラーに提供するサービスが Angular にあります。次のように設定されています。

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 を使用したことがないため、単純な間違いである可能性があります。

コントローラーがロードされる前に、サービスがデータを返すようにする必要があります。これはどのように達成できますか

4

4 に答える 4

42

次のような promise を返すようにファクトリを作成できます。

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;
    });
}

これにより、サービスを使用するたびに常にデータが同期的に提供され、コントローラーをロードする前に必ずしもデータをロードする必要がないことが保証されます。

于 2013-08-28T01:11:41.070 に答える
17

あなたのuserInfoサービスは によって返された promise を返す必要があり$httpます。その後、その promise がコントローラーに注入され、promise が正常に解決されるとすぐにビューが更新されます。


userInfo解決する前にビューをまったくレンダリングしたくない場合はresolve、ルートにプロパティを設定し、そこにサービスを注入する必要があります。

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

userInfoData次に、サービスの代わりにコントローラーに注入しますuserInfo

于 2013-08-28T00:51:56.897 に答える