ハイブリッド 1 + 2 アプリをブートストラップするための公式の Angular チュートリアル ( https://angular.io/docs/ts/latest/guide/upgrade.html ) の指示に従った Angular 1 アプリがあります。すべてのコードを配置してアプリを実行しましたが、まったく何も起こりません。ルート 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']);
});
上記のハイブリッド ブートストラップ コードに関する 1 つの注意事項 -私が知る限り、それは機能しています。Angular1 アプリの名前を に変更すると、ブラウザーに大量blahblah
のエラーが表示されます。このコードはMyA1App
、で定義されている Angular1 モジュールを見つけて、app.ts
それをブートストラップできます。
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'
});
}
]);
}
では、問題の概要は次のとおりです。
- 呼び出された Angular2
main.ts
へのブートストラップ(成功したように見えます - エラーなし)systemjs
index.html
- Angular1 コントローラーや Landing などにブレークポイントを配置し、コントローラーが定義されて読み込まれていることを確認できます。しかし、他に何も起こりません!エラーも何もありません。
- ディレクティブは、
ng-view
ルーティングによって更新されることはありません。メインページを調べると、次のようになります。<div class="main-content" ng-view=""></div>
- JS エラーはどこにもありません
- 戻って元の A1 ブートストラップを使用すると、A2 をロードして A1 をハイブリッドとしてブートストラップするの
index.html
とは対照的に機能します。systemjs
元のAngular1
アプリが正常にロードおよびブートストラップされているように見えますが、実際には何もしていないように見えます。
アップデート:
問題のあるコードを追跡して、次のようにしましたapp.module.ts
。
import { downgradeComponent } from '@angular/upgrade/static';
angular.module('MyA1App', [])
.directive(
'contactList',
downgradeComponent({ component: ContactListComponent }) as angular.IDirectiveFactory
);
それはルーティングではありませんでした(それはニシンでした)。Angular1
上記のコードを削除すると、アプリ全体がブートストラップして読み込まれます。上記のコードで、すべての読み込みが停止する可能性がありますが、JavaScript
エラーは発生しません。