Ответ 1
Это вызвано обновленной службой UpgradeModule, которую вы используете здесь:
import { UpgradeModule } from '@angular/upgrade/static';
Вы используете его, потому что вы хотите, чтобы UpgradeModule понизил уровень Angular 2 до Angular JS.
Если вы вникнете в код UpgradeModule, вы можете обнаружить, что этот модуль определяет новый модуль Angular с именем $$ UpgradeModule.
Этот модуль регистрирует поставщик значений с именем $$ angularInjector (тот, который указан в вышеприведенной ошибке) - эта вещь $$ angularInjector отвечает за впрыскивание модулей Angular в Angular JS.
Решение заключается в том, чтобы импортировать модуль в оператор импорта, чтобы Angular JS получал доступ к его услугам.
Вы забыли импортировать UpgradeModule. Вот ответ официальной документации:
@NgModule({
declarations: [Ng2HeroesComponent, Ng1HeroComponentWrapper],
providers: [
HeroesService,
// Register an Angular provider whose value is the "upgraded" AngularJS service
{provide: 'titleCase', useFactory: (i: any) => i.get('titleCase'), deps: ['$injector']}
],
// All components that are to be "downgraded" must be declared as `entryComponents`
entryComponents: [Ng2HeroesComponent],
// We must import `UpgradeModule` to get access to the AngularJS core services
imports: [BrowserModule, UpgradeModule]
})
class Ng2AppModule {
ngDoBootstrap() { /* this is a placeholder to stop the boostrapper from complaining */
}
}
поэтому сначала вам нужно изменить свой код на:
ng2.module.ts:
import 'reflect-metadata';
import '@angular/core';
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { UpgradeModule } from '@angular/upgrade/static';
import { AppComponent } from './components/app/app.component.ts';
@NgModule({
imports: [ BrowserModule, UpgradeModule ],
declarations: [ AppComponent ],
entryComponents: [ AppComponent ]
})
export class Ng2Module {
ngDoBootstrap() {}
}
Также, чтобы понизить ваш компонент от ng2 до Angular 1
Вы должны создать директиву AngularJS, которая сделает этот компонент Angular доступным внутри шаблонов AngularJS:
ng1AppModule.directive('Ng2Module', downgradeComponent({component: AppComponent}));
function downgradeComponent(info: { component: Type< This parameter is no longer used */ selectors?: string[]; }): any;
Существует очень полезный пост, в котором подробно объясняется, как создать гибридное приложение Angular, а также сценарий, когда у вас есть v4, и вы хотите использовать его в шаблоне v1.