Круговая зависимость в рекурсивных объектах (связанных с помощью статических методов) в Angular - PullRequest
0 голосов
/ 06 ноября 2018

Можно создавать древовидные / рекурсивные объекты в отдельных файлах и избегать предупреждения Circular dependency detected, используя Angular CLI , если я вызываю методы из рекурсивных классов?

(проверено на угловом 7) Я понимаю, что это проблема при внедрении зависимостей ( article ), но как насчет объектов, используемых в качестве конструктора для данных из внешнего API или для внутренние цели? И если это не очень хорошая идея, как вы ее решаете? (Я полагаю, что ответ на этот «подзапрос» - это изменение модели, тогда как мне изменить мою модель?) Я ищу решение, но ближайший вопрос не помог мне применить тот же подход к моей ситуации .

У меня есть Emails и Attachments (электронные письма с вложениями - и весь Email с вложениями также может быть вложением, Attachment - это отдельный объект с атрибутами, а содержимое может быть File или Email , но здесь, для простоты, предположим, что вложение всегда одно Email или ноль).
Каждый класс имеет статический метод для создания экземпляра из объекта JSON (я получаю JSON из API, затем я создам экземпляр объекта, представляющего значения API, вызвав статический метод fromJson для верхнего объекта):

файл: app / model / email.ts (часть кода)

import { Attachment } from './attachment';

export class Email {
  // some attributes
  public attachment?: Attachment;

  public static fromJson(js: JSON): Email {
    const e = new Email();
    // fill some attributes here
    if (js['attachment']) { e.attachment = Attachment.fromJson(js['attachment']); }
    return e;
  }
}

файл: app / model / attachment.ts (часть кода)

import { Email } from './email';
export class Attachment {
  // some attributes
  public content: Email;

  public static fromJson(js: JSON): Attachment {
    const a = new Attachment();
    // fill some attributes here
    if (js['email']) { a.content = Email.fromJson(js['email']); }
    return a;
  }
}

Первоначальный вызов: this.email = Email.fromJson(apiResponseForEmail);

Эта ситуация приводит к Обнаружена круговая зависимость Предупреждение после ng build | serve. Если это не хороший пример для вас, вы можете представить класс Recipe для еды, который содержит Ingredients с такими атрибутами, как количество и температура, где результат одного Recipe является ингредиентом для другого рецепта.

Если эти классы находятся в одном файле, предупреждение не выдается. Однако размещение всего в одном большом файле для меня не лучшее решение (если есть какой-либо другой).

Вот демонстрация Stackblitz с циклической зависимостью (но без предупреждений в консоли, stackblitz, очевидно, удаляет предупреждения, вам нужно скачать этот код и запустить с localhost, чтобы увидеть предупреждение).

Меня интересует, можно ли размещать такие классы (которые вызываются в коде рекурсивно статическим методом, как в примере) в отдельные файлы (файлы, названные классами) и избегать сообщения Обнаружена циклическая зависимость

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Привет, @Atiris!

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

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

Вы пытались использовать только 1 файл?
Вы можете создать пространство имен , в которое вы добавите два класса Email и Attachment .

Вот пример Stackblitz без циклической зависимости


ОТВЕТ :

Меня интересует, можно ли разместить такие классы (которые вызывается в коде рекурсивно статическим методом, как в примере) в отдельные файлы (файлы, названные по классам) и избежать циклической зависимости обнаруженное сообщение?

Я не думаю, что вы можете сделать так. Это структурный вопрос. Но я не уверен на 100%.

0 голосов
/ 06 ноября 2018

Один из способов избавиться от круговой зависимости - ввести index.ts

файл: index.ts

export { Attachment } from './attachment';
export { Email } from './email';

файл: app / model / attachment.ts (часть кода)

import * as index_file from './index';
index_file.Attachment {
  ...
  content: index_file.Email;
}

файл: app / model / email.ts (часть кода)

import * as index_file from './index';
index_file.Email {
  ...
  attachment?: index_file.Attachment;
}

PS: пожалуйста, проверьте синтаксис, я не уверен в синтаксисе

...