2

我正在尝试使用 Angular 2+(在撰写此问题时为 Angular 4.1.0)引导 Angular 1.X 应用程序。我遵循了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 函数进行了测试,以查看是否有任何运行或抛出错误,但它们没有。

然后我有一个 Angular 2+ 应用程序的入口文件(我也将它用作 Webpack 的入口文件)main.ts,它看起来像这样:

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() {
  }
};

编辑2

我的预感是 Angular 2+ 依赖于 AngularJS 1.X 已经在窗口对象上。我在一个模块中运行 AngularJS 1.X。我会在工作时更新。我在下面回答了一些评论。目前,我正在使用尽可能简单的示例,对于 AngularJS 1.X,我实际上正在运行一个准系统应用程序,如果它被引导通过.run

编辑 3

我在下面发布了一个答案。它归结为main.ts文件(入口文件)中导入的顺序。只需在导入之前导入 AngularJS 1.X 应用程序即可zone.js解决问题。

4

1 回答 1

2

我讨厌回答我自己的问题(因此不感谢所有帮助过的人,谢谢!)但这是解决问题的方法。

我更改了入口文件中的导入顺序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')
})

我基本上只需要先导入 AngularJS 1.X 应用程序zone.js。我不确定为什么会这样,但它完美无缺。

编辑

我在 Angular 的 repo 上提交了一个问题,并得到了一个“官方”的答案。它适用于 4.1.0-rc.0 及更高版本。有一种方法可以手动设置对 AngularJS 的引用,而不是让系统尝试从window对象中获取它。事实上,AngularJS 似乎window在运行时会附加到它本身,即使它是捆绑的。但是,它这样做“为时已晚”(这就是我的修复工作的原因)。

因此,您可以执行以下操作:

import { setAngularLib } from '@angular/upgrade/static';
import * as angular from 'angular';

setAngularLib(angular);
// do your bootstrap here
于 2017-05-08T14:59:25.850 回答