Angular 2+ 找不到 Angular 1.X 至 bootstrap
Angular 2+ can't find Angular 1.X to bootstrap
我正在尝试 bootstrap Angular 1.X 应用 Angular 2+(Angular 4.1.0 在撰写本文时题)。我沿着 online guide 到达了 T,但似乎无法取得进展。
我正在使用 ES2015+(通过 Babel 编译)和 TypeScript 的混合体。一切都正确编译,我可以 运行 Angular 1 和 Angular 2 分别成功。如果有所不同,它们会使用 Webpack 一起编译。
这是我的 Angular 1.X 条目文件 (app.ts
) 的大致样子:
import * as angular from 'angular';
export default angular.module('app', [])
.run(function() { console.log('Angular 1 is running!')})
为简单起见,我从主应用程序中删除了所有依赖项,以便我可以确定它不是 run/config 函数或依赖项之一。我已经使用 config/run 函数进行了测试,以查看是否有任何 运行 或抛出错误,但它们没有。
然后我有一个名为 main.ts
的 Angular 2+ 应用程序的入口文件(我也将其用作 Webpack 的入口文件),如下所示:
import 'core-js/es7/reflect';
import 'zone.js';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { UpgradeModule } from '@angular/upgrade/static';
import { AppModule } from './app.module';
import app from '../app/app';
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule).then(platformRef => {
console.log('angular 2+ bootstrapped');
const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
console.log('getting update module');
console.log('app', app)
upgrade.bootstrap(document.body, [app.name], { strictDi: true})
console.log('should be bootstrapped')
})
进程在 console.log('app', app)
行后失败。日志显示 app
确实是 Angular 1.X 应用程序的一个实例。但是 bootstrap 过程仍然失败。
关于我做错了什么有什么想法吗?
编辑
这是我的 app.module
文件:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { UpgradeModule } from '@angular/upgrade/static';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
UpgradeModule
],
declarations: [
AppComponent
],
entryComponents: [
AppComponent
]
})
export class AppModule {
constructor(protected upgrade: UpgradeModule) {}
ngDoBootstrap() {
}
};
EDIT2
我的直觉是 Angular 2+ 依赖于 AngularJS 1.X 已经在 window 对象上。我在一个模块中 运行ning AngularJS 1.X。我会在处理它时进行更新。我在下面回答了一些评论。目前,我正在使用尽可能简单的示例,对于 AngularJS 1.X,我实际上是在 运行 宁一个准系统应用程序,如果它是 bootstrap通过.run
编辑 3
我在下面发布了一个答案。它归结为 main.ts
文件(入口文件)中的导入顺序。只需在导入 zone.js
之前导入 AngularJS 1.X 应用即可解决此问题。
我不想回答我自己的问题(因此不感谢所有提供帮助的人,谢谢!)但这是解决问题的方法。
我更改了 main.ts
入口文件中的导入顺序! :)
新版本如下所示:
import app from '../app/app.temp';
import 'core-js/es7/reflect';
import 'zone.js';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { UpgradeModule } from '@angular/upgrade/static';
import { AppModule } from './app.module';
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule).then(platformRef => {
console.log('angular 2+ bootstrapped');
const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
console.log('getting update module');
console.log('app', app)
upgrade.bootstrap(document.body, [app.name], { strictDi: true})
console.log('should be bootstrapped')
})
我基本上只需要在 zone.js
之前导入 AngularJS 1.X 应用程序。我不确定为什么会这样,但它完美无缺。
编辑
我在 Angular 的 repo 上提交了一个问题并得到了 "official" 的答复。它适用于 4.1.0-rc.0 及更高版本。有一种方法可以手动设置对 AngularJS 的引用,而不是让系统尝试从 window
对象中获取它。事实上,AngularJS 似乎在运行时将自身附加到 window
,即使它是捆绑的;但是,它确实如此 "too late"(这就是我的修复有效的原因)。
因此,您可以执行以下操作:
import { setAngularLib } from '@angular/upgrade/static';
import * as angular from 'angular';
setAngularLib(angular);
// do your bootstrap here
我正在尝试 bootstrap Angular 1.X 应用 Angular 2+(Angular 4.1.0 在撰写本文时题)。我沿着 online guide 到达了 T,但似乎无法取得进展。
我正在使用 ES2015+(通过 Babel 编译)和 TypeScript 的混合体。一切都正确编译,我可以 运行 Angular 1 和 Angular 2 分别成功。如果有所不同,它们会使用 Webpack 一起编译。
这是我的 Angular 1.X 条目文件 (app.ts
) 的大致样子:
import * as angular from 'angular';
export default angular.module('app', [])
.run(function() { console.log('Angular 1 is running!')})
为简单起见,我从主应用程序中删除了所有依赖项,以便我可以确定它不是 run/config 函数或依赖项之一。我已经使用 config/run 函数进行了测试,以查看是否有任何 运行 或抛出错误,但它们没有。
然后我有一个名为 main.ts
的 Angular 2+ 应用程序的入口文件(我也将其用作 Webpack 的入口文件),如下所示:
import 'core-js/es7/reflect';
import 'zone.js';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { UpgradeModule } from '@angular/upgrade/static';
import { AppModule } from './app.module';
import app from '../app/app';
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule).then(platformRef => {
console.log('angular 2+ bootstrapped');
const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
console.log('getting update module');
console.log('app', app)
upgrade.bootstrap(document.body, [app.name], { strictDi: true})
console.log('should be bootstrapped')
})
进程在 console.log('app', app)
行后失败。日志显示 app
确实是 Angular 1.X 应用程序的一个实例。但是 bootstrap 过程仍然失败。
关于我做错了什么有什么想法吗?
编辑
这是我的 app.module
文件:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { UpgradeModule } from '@angular/upgrade/static';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
UpgradeModule
],
declarations: [
AppComponent
],
entryComponents: [
AppComponent
]
})
export class AppModule {
constructor(protected upgrade: UpgradeModule) {}
ngDoBootstrap() {
}
};
EDIT2
我的直觉是 Angular 2+ 依赖于 AngularJS 1.X 已经在 window 对象上。我在一个模块中 运行ning AngularJS 1.X。我会在处理它时进行更新。我在下面回答了一些评论。目前,我正在使用尽可能简单的示例,对于 AngularJS 1.X,我实际上是在 运行 宁一个准系统应用程序,如果它是 bootstrap通过.run
编辑 3
我在下面发布了一个答案。它归结为 main.ts
文件(入口文件)中的导入顺序。只需在导入 zone.js
之前导入 AngularJS 1.X 应用即可解决此问题。
我不想回答我自己的问题(因此不感谢所有提供帮助的人,谢谢!)但这是解决问题的方法。
我更改了 main.ts
入口文件中的导入顺序! :)
新版本如下所示:
import app from '../app/app.temp';
import 'core-js/es7/reflect';
import 'zone.js';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { UpgradeModule } from '@angular/upgrade/static';
import { AppModule } from './app.module';
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule).then(platformRef => {
console.log('angular 2+ bootstrapped');
const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
console.log('getting update module');
console.log('app', app)
upgrade.bootstrap(document.body, [app.name], { strictDi: true})
console.log('should be bootstrapped')
})
我基本上只需要在 zone.js
之前导入 AngularJS 1.X 应用程序。我不确定为什么会这样,但它完美无缺。
编辑
我在 Angular 的 repo 上提交了一个问题并得到了 "official" 的答复。它适用于 4.1.0-rc.0 及更高版本。有一种方法可以手动设置对 AngularJS 的引用,而不是让系统尝试从 window
对象中获取它。事实上,AngularJS 似乎在运行时将自身附加到 window
,即使它是捆绑的;但是,它确实如此 "too late"(这就是我的修复有效的原因)。
因此,您可以执行以下操作:
import { setAngularLib } from '@angular/upgrade/static';
import * as angular from 'angular';
setAngularLib(angular);
// do your bootstrap here