Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度2+;can';找不到角度为1.X的引导_Angularjs_Angular_Ng Upgrade_Angular Hybrid - Fatal编程技术网

Angularjs 角度2+;can';找不到角度为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';

我正在尝试用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';

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中。“这将是一个棘手的下坡问题,但玩得开心!”詹姆斯在我的博客上写道?我想我没有提到任何关于过渡的内容。不过还是谢谢你的阅读!:)