Angular.js:如何为所有应用程序控制器调用一次服务
我不知道这是甚至是Angular概念之一还是可能做到的,但我有一个服务调用用户信息(名称,ID ,年龄,...):Angular.js:如何为所有应用程序控制器调用一次服务
.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次
我一直在做与服务类似的事情,通过在第一次返回时将值设置为服务。现在,一旦数据在服务中设置,它将返回存储的用户数据,而不是向服务器发送请求。
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()
//Assume Value1 and Service1 have been correctly injected
if (Value1.data === null) {
Your_Var = Service1.call;
} else {
Your_Var = Value1.data;
}
为了简单起见,实施的时候我会提出,在三元表达。
符合DRY要求。
干去,我们需要一个SharedFactoryFuncion处理$ HTTP请求
Your_Var = Service1.call;
//Inside Service1.call
return Value1.data === undefined ? SharedFactoryFuncion.get("url") : Value1.data;
有许多方法来处理数据从不用彷徨()的返回,所以我不会去那里,因为它是不恰当的。
所以你需要注入两个对象?这似乎不必要和混乱。在每个控制器中重复上述逻辑也不是干的。将数据存储在服务中时,您只需调用'myService.getData()'。对他自己的 – user2954587
不是,但有服务获取和存储数据违反单一责任原则。我会更新以反映DRY合规性。 – tuckerjt07
这种方法可行,但在我看来,将回归设置为一个值,并且只有在该值不存在时才进行调用是一种更好的方法。这归结为关注的分离。服务或工厂的工作是做或得到。你可以说我们甚至滥用do部分,但我离题了。值或常数的工作是保存数据。分开这两个单独的任务将在应用程序变得更大和更复杂时从长远来看付出代价。 – tuckerjt07
我明白user295 ......在说什么,但我不完全明白你在暗示什么。您建议服务设置一个值并检查它,而不是在服务中设置“数据”?为user295 +1 ...顺便说一句,这就是我将如何做到这一点,但我可能是完全错误的。 – VSO
@ tuckerjt07不遵循你所说的话。此服务只进行一次调用,然后存储返回值。我们在一个庞大而复杂的应用中使用这种方法,它运行良好 – user2954587