Я пытаюсь сделать '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 вообще невозможно, кроме случаев, когда мы явно выводим что-то в инжектор со всем его поддеревом зависимости?