Angular.js:如何为所有app控制器调用一次服务

时间:2015-07-11 23:55:03

标签: angularjs

我不知道这是否是Angular概念中的一个或可能做的,但我有一个调用用户信息的服务(name,id,age,...):

.factory('me', function($resource, API_URL, $q) {
    return {
        getUser: function() {
            var deferred = $q.defer();
            var url = API_URL + 'api/me';
            $resource(url)
                .get(function(user) {
                    deferred.resolve(user);
                }, function(response) {
                    deferred.reject(response);
                });
            return deferred.promise;
        }
    };
})

我在许多controllers中使用此服务来获取user数据,并将其用于与其他http次调用一起发送。例如在我的newItemCtrl

.controller('newItemCtrl', function($scope, $http, API_URL, me) {

我调用了me服务,正如我在许多其他控制器中所做的那样

我想知道有没有办法只调用一次这个服务并在所有控制器中使用它,而不是在每个控制器中使用x次

2 个答案:

答案 0 :(得分:5)

我通过在第一次返回服务后将值设置为服务,始终对服务执行类似的操作。现在,一旦在服务中设置了数据,它将返回存储的用户数据,而不是向服务器发出请求。

service('myService', function($q, $http) {
  this.data;
  var self = this;

  this.getMyData = function() {
    if (angular.isDefined(self.data)) {
      // use $q to return a promise
      return $q.when(self.data)
    }
    return $http.get('myurl').then(function(resp) {
      self.data = resp;
    })
  }

}

在您的控制器中,您可以拨打myService.getMyData()

答案 1 :(得分:0)

//Assume Value1 and Service1 have been correctly injected
if (Value1.data === null) {
     Your_Var = Service1.call;
} else {
    Your_Var = Value1.data;
} 

为简单起见,我会在实现时将其置于三元表达式中。

符合DRY标准。

使用DRY我们需要一个SharedFactoryFuncion来处理$ http请求

Your_Var = Service1.call;
//Inside Service1.call
return Value1.data === undefined ? SharedFactoryFuncion.get("url") : Value1.data;

有许多方法可以处理来自.get()的数据返回,所以我不会去那里,因为它不相关。