使用downgradeComponent

时间:2016-12-01 17:36:00

标签: javascript angularjs angular route-provider angular2-upgrade

我有一个Angular 1应用程序,我遵循官方Angular教程(https://angular.io/docs/ts/latest/guide/upgrade.html)中的指示来引导混合1 + 2应用程序。我有所有代码并运行应用程序,绝对没有任何反应。它只是转到根URL,我只得到index.html中任何内容的样式和视图。但是主<div ng-view>永远不会通过$routeProviderapp.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中定义的app.ts 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 (来自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错误
  • 如果我回去使用index.html中的原始A1引导程序,则可以使用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错误?

2 个答案:

答案 0 :(得分:2)

嗯,我已经深入到了这个问题的底层,因为我遵循了UPGRADING FROM 1.X教程,所以我的时间长度令人失望。在本教程中,它显示了完全示例代码,通过Angular 2模块将directive组件注册为Angular 1来降级angular.module('heroApp', []) .directive( 'heroDetail', downgradeComponent({component: HeroDetailComponent}) as angular.IDirectiveFactory ); 组件:

[]

注意模块名称Angular1后面的空括号? 是个问题。它给了我一个疯狂的追逐,因为当我直接从教程中获得它时,我开始在A1中没有定义我的控制器的错误。由于其中很多内容仍然很新鲜,我继续进行了一次疯狂的追逐,剥离了我A2应用的部分内容,试图让它们发挥作用,认为它们与A1不兼容。直到我在同一个教程中读到,“现有的Angular 1代码和以前一样工作,你准备好运行Angular 2代码”这导致我进行了消除A2引导代码错误,最终括号无法加载。

我的OP注意到我没有收到任何错误。这是因为我已经删除了很多angular.module('MyA1App') .directive('contactList', downgradeComponent({ component: ContactListComponent }) as angular.IDirectiveFactory); 代码,试图让工作正常工作并且达到应用程序加载但没有显示任何内容并认为这是路由问题。

我的工作代码如下:

<tr> 
<TD><?echo $data['name'] ?></TD> 
<TD><?echo $data['email'] ?></TD> 
</tr>

答案 1 :(得分: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>

  3. 像这样更新你的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() {
      }
    }