2015-09-04 5 views
0

Ищет несколько советов, если это возможно.AngularJS Circular Dependency - Трансформаторы

При работе с 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); 
    } 
}) 
; 

Event трансформаторные

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; 
    } 

}) 
; 

Как вы можете себе представить, есть еще несколько отношений с каждым из этих ресурсов, но эти службы должны зависеть друг от друга. Я мог бы получить доступ к ресурсу Event и иметь вложенные клиенты или наоборот.

Угловое действительно не нравится, и выдает ошибку круговой зависимости, но я не уверен, как я могу обойти это, или лучший способ структурирования моего приложения.

Любая помощь была бы оценена

Спасибо!

+0

это хак, так что им отправляю это как комментарий, вы можете создать угловую переменную 'Transformers' и каждый трансформатор на создание будет добавлено к этой переменной. и вместо того, чтобы вводить трансформатор, вы просто вводите эту переменную. таким образом, вы можете избавиться от круговой зависимости. что правильно? я скажу, редизайна вашего кода – user902383

ответ

0

Вы можете ввести службу инжектора $ и получить зависимость, когда вы ее используете.

Вот ваш обходной путь:

.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; 
    } 

}) 
Смежные вопросы