角度决定对承诺的依赖

时间:2014-09-26 17:31:18

标签: angularjs

所以这是我的一般问题,我有一个工厂需要进行ajax调用才能获得它的价值。我想注入这个工厂,但只有在ajax调用解决之后,这意味着,当它被注入时,我希望值已经存在。这可能吗?让我给你一些背景信息,这样你就可以给我一个更好的选择。

我有一个UserFactory。

var app = angular.module('app',[]);
app.factory('UserFactory',[

    function(){
      //ajax call to get the user object  
      //dont allow injection until user has arrived
   }
]);


var home = angular.module('home',[]);
home.controller('UserInfoController',[
   'UserFactory',//I don't want this resolved until the ajax call has completed
    function(User){
      //bind user data to the view
    }
]);

这可能吗?或者我错了吗?我希望能够访问用户的信息,而不必每次都使用promises,以防它已经不存在。

2 个答案:

答案 0 :(得分:0)

您可以做的是设置工厂,以便记住用户数据。

像这样的东西

app.factory('userFactory', function ($http){
    return {
        getUser: function(){
            return $http({
                method: 'GET',
                url: ''
            });
        },
        currentUser: {}
    };
});

然后在您的控制器中,检查currentUser中是否有任何内容。如果没有进行getUser调用并将其存储到currentUser中。由于工厂是单件,因此用户数据将始终存在于此工厂内,您可以将其注入任何需要的地方。

以下是一个示例:http://jsfiddle.net/4m6gmsw2/

如果在注入之前仍需要用户数据,您可以查看使用解决方法:https://thinkster.io/egghead/resolve/

答案 1 :(得分:0)

在状态路由器中,每个州都有解析属性。

.state({
  name: 'myState',
  resolve: {
    user: function(myService) {
      return myService.asyncGet();
    }
  }

然后在你的控制器中:

.controller('myController', function(user) {
  $scope.myData = user.data;  //no messy promises
});