我不知道这是否是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次
答案 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()的数据返回,所以我不会去那里,因为它不相关。