Хранение экземпляра инжектора для использования в компонентах

Перед RC5 я использовал инкремент appref в качестве локатора сервисов следующим образом:

Startup.ts

bootstrap(...) .then((appRef: any) => { ServiceLocator.injector = appRef.injector; }); 

ServiceLocator.ts

 export class ServiceLocator { static injector: Injector; } 

компоненты:

 let myServiceInstance = ServiceLocator.injector.get(MyService) 

Теперь выполняем то же самое в bootstrapModule (). Then () не работает, потому что компоненты, похоже, начинают выполняться перед promiseм.

Есть ли способ сохранить экземпляр инжектора перед загрузкой компонентов?

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

Для сегодняшнего TypeScript и Angular 5, избегая WARNING in Circular dependency detected при импорте глобального инжектора, сначала объявите помощника, например app-injector.ts :

 import {Injector} from '@angular/core'; /** * Allows for retrieving singletons using `AppInjector.get(MyService)` (whereas * `ReflectiveInjector.resolveAndCreate(MyService)` would create a new instance * of the service). */ export let AppInjector: Injector; /** * Helper to set the exported {@link AppInjector}, needed as ES6 modules export * immutable bindings (see http://2ality.com/2015/07/es6-module-exports.html) for * which trying to make changes after using `import {AppInjector}` would throw: * "TS2539: Cannot assign to 'AppInjector' because it is not a variable". */ export function setAppInjector(injector: Injector) { if (AppInjector) { // Should not happen console.error('Programming error: AppInjector was already set'); } else { AppInjector = injector; } } 

Затем, в AppModule , установите его, используя:

 import {Injector} from '@angular/core'; import {setAppInjector} from './app-injector'; export class AppModule { constructor(injector: Injector) { setAppInjector(injector); } } 

И везде, где это необходимо, используйте:

 import {AppInjector} from './app-injector'; const myService = AppInjector.get(MyService); 

Мне удалось это сделать, используя ручную развертку. Не используйте объявление « bootstrap: [AppComponent] » в @NgModule , вместо этого используйте метод ngDoBootstrap :

 export class AppModule { constructor(private injector: Injector) { } ngDoBootstrap(applicationRef: ApplicationRef) { ServiceLocator.injector = this.injector; applicationRef.bootstrap(AppComponent); } } 

Другое решение с угловым итогом 2.0.0:

 platformBrowserDynamic().bootstrapModule(AppModule, [ { defaultEncapsulation: ViewEncapsulation.Emulated, providers: [ { provide: TRANSLATIONS, useValue: TRANSLATION }, { provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }, { provide: LOCALE_ID, useValue: 'fr' } ] } ]).then((modref: NgModuleRef) => { appInjector(modref.injector); }); 
  • Angle $ scope. $ Apply vs $ timeout как безопасный $ apply
  • Угловой фильтр 2 / список поиска
  • Как получить абсолютный путь к текущей странице в Angular 2?
  • Угловое 2 - двухстороннее связывание с NgModel в NgFor
  • Как использовать HashLocationStrategy с виджем Auth0 Lock для входа пользователя
  • Страница обновления Angular2 router.navigate обновить
  • Функция Angular2 canActivate (), вызывающая функцию async
  • Как использовать * ngIf else в Angular?
  • Как использовать событие нажатия клавиши в AngularJS?
  • Связывает Angularjs с новым элементом html динамически
  • CORS и API API Google Maps
  • Давайте будем гением компьютера.