У меня есть проект, в котором используется material2 ("@ angular / material": "^ 2.0.0-beta.6")

Согласно документам, здесь, говорится, что MaterialModule удален, а forRoot () уже подавлен. Я знаю мыслительный процесс разбиения модуля на части, чтобы обеспечить правильное встряхивание дерева, но зачем удалять forRoot и из подмодулей?

Рассмотрим этот вариант использования

Два модуля зависят от одного и того же субмодуля материала, такого как OverlayModule. ПРИМЕЧАНИЕ. У этого модуля материалов есть собственные поставщики.

  • Первый модуль загружен лениво.
  • Второй модуль загружен с нетерпением.

Как мне структурировать мой новый AppSpecificMaterialModule, чтобы я мог также предоставить всех поставщиков материалов и предотвратить дублирование синглтонов поставщиков? Должен ли я принимать во внимание конкретных поставщиков материалов, которые в конечном итоге будут потреблять мое приложение, а затем предоставлять себя на уровне appModule? Вроде того, что описано здесь?

2
DynaWeb 14 Июн 2017 в 01:00

1 ответ

Лучший ответ

Методы forRoot() были удалены, потому что команда Angular Material нашла новое решение, гарантирующее, что данный провайдер является одноэлементным.

Перед созданием поставщика в Material существует фабрика поставщиков, которая проверяет, существует ли уже экземпляр данного поставщика.

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

В репозиторий Angular поступило официальное предложение: https://github.com/angular/angular / issues / 13854

Вот ссылка на один из примеров фабрики поставщиков Angular Material: https: // github.com/angular/material2/blame/master/src/lib/core/a11y/live-announcer.ts#L86-L94

В основном следующая строка пытается внедрить любой другой существующий экземпляр поставщика LiveAnnouncer (пропуская себя) в фабрику

[new Optional(), new SkipSelf(), LiveAnnouncer]

Затем фабричная функция получает любой существующий экземпляр LiveAnnouncer как параметр DI в фабрике и просто возвращает существующий экземпляр, если он присутствует.

В противном случае он просто создаст экземпляр new LiveAnnouncer(XXX).

export function xxxFactory(parentAnnouncer: LiveAnnouncer) {
  return parentAnnouner || new LiveAnnouncer(XXX); 
}

Как структурировать свой проект

Чтобы дать ответ на ваш вопрос. По сути, вы должны просто иметь возможность снова использовать различные компоненты компонентов (не заботясь о корневом и дочернем)

2
DevVersion 15 Июн 2017 в 16:29