Angularjs 角度2+;can';找不到角度为1.X的引导
我正在尝试用Angular 2+引导Angular 1.X应用程序(撰写此问题时为Angular 4.1.0)。我沿着这条路走到了终点,但似乎没有取得进展 我使用的是ES2015+(通过Babel编译)和TypeScript的混合体。一切编译正确,我可以分别成功运行Angular 1和Angular 2。如果有区别的话,他们可以使用Webpack一起编译 下面是我的Angular 1.X输入文件(Angularjs 角度2+;can';找不到角度为1.X的引导,angularjs,angular,ng-upgrade,angular-hybrid,Angularjs,Angular,Ng Upgrade,Angular Hybrid,我正在尝试用Angular 2+引导Angular 1.X应用程序(撰写此问题时为Angular 4.1.0)。我沿着这条路走到了终点,但似乎没有取得进展 我使用的是ES2015+(通过Babel编译)和TypeScript的混合体。一切编译正确,我可以分别成功运行Angular 1和Angular 2。如果有区别的话,他们可以使用Webpack一起编译 下面是我的Angular 1.X输入文件(app.ts)的大致外观: import * as angular from 'angular';
app.ts
)的大致外观:
import * as angular from 'angular';
export default angular.module('app', [])
.run(function() { console.log('Angular 1 is running!')})
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')
})
为了简单起见,我删除了主应用程序中的所有依赖项,以便确保它不是run/config函数或其中一个依赖项。我已经使用config/run函数进行了测试,以查看这些函数是否有运行或抛出错误,但它们没有
然后我的Angular 2+应用程序有一个名为main.ts
的条目文件(我也将其用作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应用程序的一个实例。但引导过程仍然失败
有没有关于我做得不对的想法
编辑
这是我的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
我的直觉是AngularJS 2+依赖于AngularJS 1.X已经在窗口对象上。我在一个模块中运行AngularJS 1.X。我会在工作时更新它。我在下面回答了一些评论。目前,我正在使用一个尽可能简单的示例,对于AngularJS 1.X,我正在运行一个裸体应用程序,如果它是通过引导的,则会注销
编辑3
我在下面贴了一个答案。归结起来就是main.ts
文件(入口文件)中导入的顺序。只需在导入zone.js
之前导入AngularJS 1.X应用程序,即可解决此问题 我不想回答我自己的问题(因此,我不会表扬所有帮助过我的人,谢谢!),但下面是解决问题的方法
我在main.ts
entry文件中更改了导入顺序!:)
以下是新版本的外观:
import * as angular from 'angular';
export default angular.module('app', [])
.run(function() { console.log('Angular 1 is running!')})
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的回购协议上提出了一个问题,并得到了“官方”的答复。它适用于4.1.0-rc.0及更高版本。有一种方法可以手动设置对AngularJS的引用,而不是让系统尝试从窗口
对象获取它。事实上,AngularJS在运行时似乎将自己连接到窗口
,即使它是捆绑的;然而,它这样做“太晚了”(这就是为什么我的修复工作)
下面是您可以做的:
import { setAngularLib } from '@angular/upgrade/static';
import * as angular from 'angular';
setAngularLib(angular);
// do your bootstrap here
我摆脱了巴别塔和网页包,同样的问题。测试用例正如我上面所描述的,您也可以这样做,强制执行旧脚本的顺序。问题是,我想交叉授粉的组件,以便我可以转换应用程序更容易。我宁愿使用imports/requires,而不是依赖AngularJS的全局访问。读了你的博客后,我有点明白你为什么这么做了。想要使用Angular2代码解决大多数新问题,同时将遗留内容保留在旧angularJS中。“这将是一个棘手的下坡问题,但玩得开心!”詹姆斯在我的博客上写道?我想我没有提到任何关于过渡的内容。不过还是谢谢你的阅读!:)