Я рекомендую ng-book, в ней есть полная глава о гибридных приложениях. Обратите внимание, что UpgradeAdapter в книге устарел. Но многие концепции остаются в силе.
NgUpgrade является официальным пакетом, чтобы делать то, что вы хотите.
Первое, что вы должны сделать, это поместить скрипт в нужный файл. И не в HTML. Тогда вы можете сделать серьезное кодирование.
Вы должны следовать документу NgUpgrade, чтобы запустить 2 приложения.
https://angular.io/guide/upgrade#bootstrapping-hybrid-applications
вам нужен один загрузчик для AngularJS:
angular.bootstrap(document.body, ['heroApp'], { strictDi: true });
И один загрузчик для Angular 8:
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
platformBrowserDynamic().bootstrapModule(AppModule);
Вы заметите, что NgModule имеет опорную линию к AngularJs.
Код, который они дают, предназначен для компиляции JIT.
Производственная сборка в компиляции AOT будет выглядеть следующим образом:
import { enableProdMode } from '@angular/core';
import { platformBrowser } from '@angular/platform-browser';
const { AppModuleNgFactory } = require('../aot/src/app/AppModule.ngfactory');
enableProdMode();
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);
-
Вы должны знать, что директива в AngularJS соответствует тому, что подразумевается под компонентом в Angular 8.
У вас есть 2 варианта.
inject Angular 8 components in ANgular JS directives
inject Angular JS directives in ANgular 8 components.
Я рекомендую обновить компоненты ANgularJs внутри компонентов Angular 8. Как и в будущем, вы сходитесь к переходу только на Angular 8.
Для копирования каждого компонента AngularJS в компонент Angular 8 потребуется определенная работа.
Чтобы сократить объем работы, запустите Angular JS как есть. И поместите директивы Angular 8 вне шаблонов AngularJS.
<div id="angularjs-root"></div>
<div my-unaltereted-angular8-component></div>
Может быть, я ошибаюсь, и вы не можете поставить их отдельно. Но стоит попробовать.
Сам я динамически внедряю элементы DOM из Angular8 в приложение JQuery. Но вы не можете сделать это в AngularJS, поскольку он имеет жизненный цикл для всех узлов. Однако, с некоторой осторожностью, удаляя визуализацию обнаружения изменений для узла, огромное дерево узлов из Angular 8 может быть вставлено в шаблон шаблона ANgularJs, и это без понижения.
Это то, что я использую.
addComponentToElement({ component, element }: { component: any, element: any }) {
// Create a component reference from the component
const componentRef = this.componentFactoryResolver
.resolveComponentFactory(component)
.create(this.injector);
// Attach component to the appRef so that it's inside the ng component tree
this.appRef.attachView(componentRef.hostView);
// Get DOM element from component
const domElem = (componentRef.hostView as EmbeddedViewRef<any>)
.rootNodes[0] as HTMLElement;
// Append DOM element to the body
element.appendChild(domElem);
// detect changes
componentRef.changeDetectorRef.detectChanges();
}
В AppModule потребуется добавить каждый компонент внутри entryComponents:
entryComponents: [ InjectedCOmponent1m InjectedCOmponent2]