2015-07-11 56 views
2

我不知道這是甚至是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次

回答

4

我一直在做與服務類似的事情,通過在第一次返回時將值設置爲服務。現在,一旦數據在服務中設置,它將返回存儲的用戶數據,而不是向服務器發送請求。

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()

+0

這種方法可行,但在我看來,將回歸設置爲一個值,並且只有在該值不存在時才進行調用是一種更好的方法。這歸結爲關注的分離。服務或工廠的工作是做或得到。你可以說我們甚至濫用do部分,但我離題了。值或常數的工作是保存數據。分開這兩個單獨的任務將在應用程序變得更大和更復雜時從長遠來看付出代價。 – tuckerjt07

+0

我明白user295 ......在說什麼,但我不完全明白你在暗示什麼。您建議服務設置一個值並檢查它,而不是在服務中設置「數據」?爲user295 +1 ...順便說一句,這就是我將如何做到這一點,但我可能是完全錯誤的。 – VSO

+0

@ tuckerjt07不遵循你所說的話。此服務只進行一次調用,然後存儲返回值。我們在一個龐大而複雜的應用中使用這種方法,它運行良好 – user2954587

0
//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; 

有許多方法來處理數據從不用彷徨()的返回,所以我不會去那裏,因爲它是不恰當的。

+0

所以你需要注入兩個對象?這似乎不必要和混亂。在每個控制器中重複上述邏輯也不是乾的。將數據存儲在服務中時,您只需調用'myService.getData()'。對他自己的 – user2954587

+0

不是,但有服務獲取和存儲數據違反單一責任原則。我會更新以反映DRY合規性。 – tuckerjt07

相關問題