Угловой динамический DI со строковым токеном - PullRequest
0 голосов
/ 25 октября 2018

Похоже, что Angular 6 (4+?) Требует, чтобы токен объектов был уникальным для работы DI.Тем не менее, я хочу использовать динамический токен, предоставляемый из шаблона html-кода, который позволит моей новой директиве разрешать службу по имени .

В настоящее время код:

this.service = this.injector.get(new InjectionToken<IServiceRef>(tokenName));

Сбой:

Error: StaticInjectorError(AppModule)[InjectionToken the_token_name]: 

Когда я заменил свой код на старую функцию Injector.get со старым ограничением (в угловых 4), все работает нормально, потому что инжектор сравнивает имена (и я предоставляюслужба в представлении под этим именем ...).Однако с новым DI я не могу достичь того, чего хочу.

Итак, как справиться?

1 Ответ

0 голосов
/ 25 октября 2018

Вы должны использовать глобальный объект хранения для своих токенов.Я рекомендую вам использовать карту.

export const tokens: Map<string, InjectionToken<IServiceRef>> = new Map();
tokens.set('tokenName', new InjectionToken<IServiceRef>('tokenName'));

Вы должны использовать объект карты для объявления провайдера.

@NgModule({
     providers: [
          {provide: tokens.get('tokenName'), useValue: new Service()}
     ]
 );

Теперь вы можете искать токен через строковое значение.

this.service = this.injector.get(tokens.get(the_token_name));

Я не знал, что это изменилось в Angular 6, но я напоминаю, что в документации сказано, что токены являются ссылочными значениями.Это означает, что DI использует === для сопоставления зависимостей.

Вы получите коллизии в DI, если сопоставите по именам токенов.Многие библиотеки объявляют токен «документ» в качестве примера.Таким образом, вы не хотите использовать строковые имена.Так как столкновение будет крайне сложно найти и исправить.

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