Angularjs Angular.js:如何为所有应用程序控制器调用一次服务

Angularjs Angular.js:如何为所有应用程序控制器调用一次服务,angularjs,Angularjs,我不知道这是否是一个角度概念或可能做到的,但我有一个服务调用用户信息(姓名、id、年龄等): 我在许多控制器中使用此服务来获取用户数据,并将其用于发送其他http调用。例如,在mynewItemCtrl .controller('newItemCtrl', function($scope, $http, API_URL, me) { 我调用了me服务,就像在许多其他控制器中一样 我想知道是否有一种方法可以只调用此服务一次,并在所有控制器中使用它,而不是在每个控制器中使用x次我一直在服务中做类似

我不知道这是否是一个角度概念或可能做到的,但我有一个服务调用用户信息(姓名、id、年龄等):

我在许多
控制器
中使用此服务来获取
用户
数据,并将其用于发送其他
http
调用。例如,在my
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()

为了简单起见,在实现时,我会将其放在一个三元表达式中

用于干燥合规性

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

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

有很多方法可以处理从.get()返回的数据,因此我不打算去那里,因为这与此无关

这种方法会起作用,但在我看来,将返回值设置为一个值,并且只有在该值不存在时才进行调用,这是一种更好的方法。这归结为关注点的分离。服务或工厂的工作是做或得到。你可以说我们甚至滥用了do部分,但我离题了。值或常量的任务是保存数据。从长远来看,当应用程序变得更大、更复杂时,将这两个独立的任务分离开来会带来好处。。。是说,但我不完全理解你的建议塔克。您建议服务设置一个值并检查它,而不是在服务中设置“数据”+1用于用户295。。。顺便说一句,我本来会这么做的,但我可能完全错了。@tuckerjt07没有听你的话。此服务只进行一次呼叫,然后存储返回值。我们在一个大型、复杂的应用程序中使用这种方法,它工作得很好。服务的工作不是保存数据,而是获取数据。这就是为什么角度包含值和常数。我会写一个答案,这样我就可以编码格式了。所以你需要注入两个对象?这似乎是不必要和令人困惑的。在每个控制器中重复上述逻辑也是不容易的。在服务中存储数据时,只需调用
myService.getData()
。对每个人来说都不是,但是让服务获取和存储数据违反了单一责任原则。我将更新以反映干式合规性。
//Assume Value1 and Service1 have been correctly injected
if (Value1.data === null) {
     Your_Var = Service1.call;
} else {
    Your_Var = Value1.data;
} 
Your_Var = Service1.call;
//Inside Service1.call
return Value1.data === undefined ? SharedFactoryFuncion.get("url") : Value1.data;