1

我有一个Angular 1应用程序,我遵循官方Angular教程(https://angular.io/docs/ts/latest/guide/upgrade.html)的指示来引导混合1 + 2应用程序。我拥有所有的代码并运行应用程序,绝对没有任何反应。它只是进入根网址,我只能看到index.html中的任何内容的样式和视图。然而主要<div ng-view>永远不会通过$routeProviderapp.ts更新。至少,这似乎是发生了什么事。有错误。以下是我迄今为止:使用降级组件引导的角度2 +角1混合应用程序不加载组件

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,我会在浏览器中看到大量错误。此代码可以找到app.ts中定义的MyA1App Angular1模块,并且能够引导它。

的index.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(从角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' 
       }); 
     } 
    ]); 
} 

所以这里的问题的概述:通过systemjs

  • 的Bootstrap到Angular2 main.ts称为index.html -
  • 我可以把断点Angular1控制器,着陆等,见(出现成功没有错误)被定义和加载的控制器被击中。但没有其他事情发生!没有错误或任何东西。
  • ng-view指令永远不会通过路由更新。在检查主页上它只是看起来像:<div class="main-content" ng-view=""></div>随时随地
  • 如果我回去,并在index.html它的工作原理,而不是使用systemjs加载A2和引导A1作为混合使用原来的A1引导
  • 没有JS错误。

我在这里做错了什么,以便原来的Angular1应用似乎加载和引导就好了,但实际上并没有做任何事情?


UPDATE:

我已经找到了问题的代码要在在app.module.ts如下:

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

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

回答

2

好吧,我已经到了这个问题的底部,并且由于遵循UPGRADING FROM 1.X教程,我的腰线时间长度令人失望。在该教程,它示出了本确切示例代码通过经由Angular 1模块注册为一个directive降级的Angular 2部件:模块名[]

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