angularjs - ngupgrade - Componente Angular2 en la aplicación Angular1
ng-href angular 6 (1)
Lo que estoy tratando de hacer es hacer que el componente Angular 2 simple se ejecute dentro de la aplicación angular 1. Estaba pasando por esta guía oficial . He enfrentado algún problema con la inyección:
Unknown provider: $$angularInjectorProvider <- $$angularInjector
La traza de la pila no tiene sentido, pero es obvio que el error se genera en algún lugar profundo del propio ángulo :)
La estructura de mi aplicación actual se ve así:
ng1.module.ts (punto de entrada):
''use strict'';
import { downgradeComponent } from ''@angular/upgrade/static'';
const angular = require(''./lib/angular-wrapper'');
const app = angular.module(''application'', []);
import { AppComponent } from ''./components/app/app.component.ts'';
import { Ng2Module } from ''./ng2.module.ts'';
app.directive(
''app'',
downgradeComponent({component: AppComponent}) as angular.IDirectiveFactory
);
angular.bootstrap(document.body, [''application'']);
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 ],
declarations: [ AppComponent ],
entryComponents: [ AppComponent ]
})
export class Ng2Module {
ngDoBootstrap() {}
}
Y app.component.ts:
import ''reflect-metadata'';
import { Component } from ''@angular/core'';
@Component({
selector: ''app'',
template: "<h1>HELLO WORLD!</h1>"
})
export class AppComponent {}
Pidiendo alguna idea sobre: ¿qué puede causar el error descrito anteriormente?
Esto es causado por el servicio actualizado de UpgradeModule que está utilizando aquí:
import { UpgradeModule } from ''@angular/upgrade/static'';
Lo está utilizando porque desea que el UpgradeModule reduzca la calificación de un componente Angular 2 a JS angular.
Si profundiza en el código del UpgradeModule, puede encontrar que este módulo define un nuevo módulo angular denominado $$ UpgradeModule.
Este módulo registra un proveedor de valores denominado $$ angularInjector (el que se encuentra en el error anterior): este $$ $$ angular es el responsable de inyectar módulos angulares en JS angular.
La solución es importar el módulo en la declaración de importaciones para que JS angular tenga acceso a sus servicios.
Olvidaste importar el UpgradeModule. Aquí está la respuesta de la documentation oficial:
@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 */
}
}
así que primero necesitas cambiar tu código a:
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() {}
}
También para degradar su componente de ng2 a angular 1
Debe crear una directiva AngularJS que haga que este componente Angular esté disponible dentro de las plantillas de AngularJS:
ng1AppModule.directive(''Ng2Module'', downgradeComponent({component: AppComponent}));
function downgradeComponent(info: { component: Type< This parameter is no longer used */ selectors?: string[]; }): any;
Hay una post muy útil que explica en detalle cómo crear una aplicación angular híbrida, y también el escenario cuando tiene un componente v4 y desea usarlo en la plantilla v1.