Angular, как создать экземпляр объекта с помощью инжектора без явного deps - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь сделать 'master-pipe'. Предполагая, что этот канал может иметь входное значение и строку форматирования в качестве параметра. Этот форматер содержит инструкции, к каким каналам обращаться в каком порядке, но я не знаю их статически, они динамические c. Это должно выглядеть так:

const message = Message('DATES_INVALID', 
  '|translate|subst:(minDate|date):(maxDate|date)', 
  {minDate: minDate, maxDate: maxDate}) -> message | masterPipe

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

Что дальше. Я не могу создать экземпляр класса требуемой трубы с помощью Injector.create. Я должен предоставить зависимости прямо к нему! Но у меня их нет. Я хочу, чтобы родительский инжектор сделал это для меня, вставляет все, что хочет канал из контекста, без явных deps. Возможно ли это в angular?

Это фрагмент кода, который я хочу сделать:

const pipeToken = new InjectionToken<PipeTransform>(pipeName);
let pipe = this.injector.get(pipeToken, null);
if (pipe === null) {
  const provider = {provide: KNOWN_PIPES[pipeName].clazz}; //no deps(!)
  const child = Injector.create({providers: [provider], parent: this.injector});
  pipe = child.get(pipeToken);
}
return pipe;

Я получил ошибку ОШИБКИ:

StaticInjectorError [{обеспечить: TranslatePipe}]: требуется 'deps'

Итак, мой вопрос: возможно ли это? Есть ли аналог нового ReflectiveInjector.resolveAndInstantiate метода в новом StaticInjector? Я понимаю, что angular заменяет каналы при компиляции, а их DI выполняется на этапе компиляции, но означает ли это, что любое динамическое внедрение c вообще невозможно, кроме случаев, когда мы явно выводим что-то в инжектор со всем его поддеревом зависимости?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...