2015-09-04 57 views
0

如果可能的話尋找一些建議。AngularJS循環依賴 - 變形金剛

在處理API和嵌套資源時,我試圖製作一組「變形金剛」,它們將數據格式化爲更有用的格式。

在這樣做的過程中,由於嵌套資源的性質,我必須創建一個循環依賴關係,並且這種關係可能會以各種方式進行。

下面是一個例子:

客戶變壓器

angular.module('services.transformers.clients', [ 

]) 
.service('ClientTransformer', function ClientTransformer(DateService, EventTransformer){ 
    var transformer = this; 

    transformer.transform = function(client) { 
     clientObject = { 
      id: client.id, 
      name: client.name 
     }; 

     if(client.events) { 
      clientObject.events = includeEvents(client); 
     } 

     return clientObject; 
    } 

    transformer.transformCollection = function(clients) { 
     for(var key in clients.data) { 
      if(clients.data.hasOwnProperty(key)) { 
       clients.data[key] = transformer.transform(clients.data[key]); 
      } 
     } 
     return clients.data; 
    } 

    function includeEvents (client) { 
     return EventTransformer.transformCollection(client.events); 
    } 
}) 
; 

事件變壓器

angular.module('services.transformers.events', [ 

]) 
.service('EventTransformer', function EventTransformer(DateService, ClientTransformer){ 
    var transformer = this; 

    transformer.transform = function(event) { 
     eventObject = { 
      id: event.id, 
      title: event.title, 
      description: event.description, 
      client: includeClient(event), 
      starts: DateService.createDateFromObject(event.starts), 
      ends: DateService.createDateFromObject(event.ends) 
     }; 

     return eventObject; 
    } 

    transformer.transformCollection = function(events) { 
     for(var key in events.data) { 
      if(events.data.hasOwnProperty(key)) { 
       events.data[key] = transformer.transform(events.data[key]); 
      } 
     } 
     return events.data; 
    } 

    function includeClient (event) { 
     // check if client is an ID or nested data. If nested, transform then return 
     return (event.client.data) ? ClientTransformer.transform(event.client.data) : event.client; 
    } 

}) 
; 

正如你可以想像,有過這些資源的幾個關係但這些服務需要相互依賴。我可以訪問事件資源,並有嵌套的客戶端或副本。

Angular確實不喜歡這樣,並拋出循環依賴錯誤,但我不知道如何解決這個問題,或者更好的方式來構建我的應用程序。

任何幫助,將不勝感激

謝謝!

+0

這是一個黑客,因此IM張貼的評論,你可以創建角變量,'Transformers'和創造每個變壓器將被添加到該變量。而是注入變壓器,您只需注入該變量。通過這種方式你可以擺脫循環依賴。什麼是正確的方式?我會說重新設計你的代碼 – user902383

回答

0

您可以注入$ injector服務並在實際使用時獲取依賴項。

這裏是你的解決方法:

.service('EventTransformer', function EventTransformer(DateService, $injector){ 

    ... 

    function includeClient (event) { 
     var t = $injector.get('ClientTransformer'); 
     return (event.client.data) ? t.transform(event.client.data) : event.client; 
    } 

})