1

我有一个 Angular 1 应用程序,我按照官方 Angular 教程 ( https://angular.io/docs/ts/latest/guide/upgrade.html ) 的说明引导混合 1+2 应用程序。我已经准备好所有代码并运行该应用程序,但绝对没有任何反应。它只是转到根 URL,我只能得到index.html. 然而,主要<div ng-view>永远不会通过$routeProvider和更新app.ts。至少这似乎是正在发生的事情。有零错误。这是我到目前为止所拥有的:

main.ts(通过 SystemJS 加载)

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { UpgradeModule } from '@angular/upgrade/static';
import { AppModule } from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule).then(platformRef => {
    const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
    upgrade.bootstrap(document.body, ['MyA1App']);
});

上述混合引导代码的一个注释 -据我所知,它正在工作。如果我将 Angular1 应用程序名称更改为blahblah,我会在浏览器中收到一大堆错误。此代码可以找到MyA1App定义的 Angular1 模块app.ts并能够引导它。

索引.html

<div class="main-content" ng-view=""></div>

<!-- Configure SystemJS (bootstrap Angular 2 app) -->
<script src="systemjs.config.js"></script>
<script>
    System.import('app').catch(function(err){ console.error(err); });
</script>

<!-- Old Angular 1 bootstrap method -->
<!--<script>
    angular.bootstrap(document.body, ['MyA1App']);
</script>-->   

app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { UpgradeModule } from '@angular/upgrade/static'; //To bootstrap a hybrid application, we  need to import UpgradeModule in our AppModule, and override it's bootstrap method:

@NgModule({
    imports: [BrowserModule, UpgradeModule ],
})

export class AppModule {
    ngDoBootstrap() {}
}

import { downgradeComponent } from '@angular/upgrade/static';
angular.module('MyA1App', [])
    .directive(
    'contactList',
    downgradeComponent({ component: ContactListComponent }) as angular.IDirectiveFactory
    );

app.ts(来自 Angular 1,它定义了模块和路由 - 这应该仍然在使用和使用)

module MyApp {
    'use strict';

export var App: ng.IModule = angular.module('MyA1App', ['ngRoute', 'ngResource', 'highcharts-ng', 'ui.bootstrap']);

    //  register work which needs to be performed on module loading
    App.config([
        '$routeProvider', '$httpProvider',
        ($routeProvider: ng.route.IRouteProvider, $httpProvider: ng.IHttpProvider) => {

            $routeProvider
                .when('/landing',
                {
                    controller: MyApp.Controllers.LandingCtrl,
                    templateUrl: '/app/angular1x/partials/landing.html'
                })
                .when('/registration',
                {
                    controller: MyApp.Controllers.RegistrationCtrl,
                    controllerAs: 'vm',
                    templateUrl: '/app/angular1x/partials/registration.html'
                })               
                .otherwise({
                    redirectTo: '/landing'
                });
        }
    ]);   
}

所以这里是问题的概述:

  • main.ts通过systemjs调用引导到 Angular2 index.html(似乎成功 - 没有错误)
  • 我可以在 Angular1 控制器、Landing 等中放置断点,并查看正在定义和加载的控制器。但没有其他事情发生!没有错误或任何东西。
  • ng-view指令永远不会通过路由更新。在主页上检查后,它看起来像:<div class="main-content" ng-view=""></div>
  • 任何地方都没有 JS 错误
  • 如果我回去使用原始的 A1 引导程序,index.html它的工作原理是使用systemjs加载 A2 和引导 A1 作为混合。

我在这里做错了什么,以至于原始Angular1应用程序似乎可以正常加载和引导,但实际上并没有做任何事情?


更新:

我已经追踪到有问题的代码如下app.module.ts

import { downgradeComponent } from '@angular/upgrade/static';
angular.module('MyA1App', [])
    .directive(
    'contactList',
    downgradeComponent({ component: ContactListComponent }) as angular.IDirectiveFactory
    );

这不是路由(那是一条红鲱鱼)。Angular1如果我删除上面的代码,整个应用程序将引导并加载。我在上面的代码中做了什么可能导致一切停止加载,但不会产生任何JavaScript错误?

4

2 回答 2

3

好吧,我已经深入了解了这个问题,但由于遵循了从 1.X 升级教程,我感到很失望。在本教程中,它显示了通过模块将组件注册为降级组件的确切示例代码:Angular 2directiveAngular 1

angular.module('heroApp', [])
  .directive(
    'heroDetail',
    downgradeComponent({component: HeroDetailComponent}) as angular.IDirectiveFactory
  );

注意模块名称后的空括号[]就是问题所在。它让我大吃一惊,因为当我得到直接来自教程的内容时,我开始收到关于我的控制器Angular1未定义的错误。由于其中很多内容仍然很新鲜,我开始了一场疯狂的追逐,剥离了我的A1应用程序的某些部分,试图让那些认为它们与A2. 直到我在同一个教程中读到,“现有的 Angular 1 代码像以前一样工作,你已经准备好运行 Angular 2 代码了”这导致我消除了 A2 引导代码中的某些内容错误的过程,并且最终,支架没有造成任何负载。

我的 OP 注意到我没有收到任何错误。这是因为我已经剥离了很多A1代码,试图让事情正常运行,并达到了应用程序加载但没有显示任何内容的地步,并认为这是一个路由问题。

我的工作代码如下:

angular.module('MyA1App')
    .directive('contactList', downgradeComponent({ component: ContactListComponent }) as angular.IDirectiveFactory);
于 2016-12-02T06:11:03.130 回答
0

我有两个建议:

  1. 在您的 index.html 中,更改<div class="main-content" ng-view=""></div><div class="main-content" ui-view></div>.

  2. <div class="main-content" ng-view=""></div>从索引中删除并添加<root-cmp></root-cmp>

像这样更新你的 app.module.ts:

@Component({  
  selector: 'root-cmp',  
  template: '<div class="main-content" ui-view></div>'  
})  
export class RootCmp {
}

@NgModule({  
  imports: [  
    BrowserModule,  
    UpgradeModule  
  ],  
  bootstrap: [RootCmp],  
  declarations: [
    RootCmp
  ],  
  providers: [],  
  entryComponents: [
    RootCmp
  ]  
})  
export class Ng2Module {
  ngDoBootstrap() {
  }
}  
于 2017-03-14T11:20:55.600 回答