【发布时间】:2017-12-14 17:26:15
【问题描述】:
我有一个使用以下指南设置的 Angular 1 和 Angular 2 混合应用程序,Upgrading from AngularJS 和 Migrating Angular 1 Application to Angular 2。我的根组件如下所示:
import { NgModule, Component } from '@angular/core';
import { RouterModule, UrlHandlingStrategy } from '@angular/router';
import { BrowserModule } from '@angular/platform-browser';
import { UpgradeModule } from '@angular/upgrade/static';
import { RouterUpgradeInitializer } from '@angular/router/upgrade';
import { MyModule } from './Mymodule/my-module';
export class Ng1Ng2UrlHandlingStrategy implements UrlHandlingStrategy {
shouldProcessUrl(url: any) {
return url.toString().startsWith("/Mymodule");
}
extract(url: any) {
return url;
}
merge(url: any, whole: any) {
return url;
}
}
@Component({
selector: 'root-component',
template: `
<router-outlet></router-outlet>
<div class="ng-view"></div>
`
})
export class RootComponent { }
@NgModule({
imports: [
BrowserModule,
UpgradeModule,
MyModule,
RouterModule.forRoot([])
],
providers: [
{ provide: UrlHandlingStrategy, useClass: Ng1Ng2UrlHandlingStrategy }
],
bootstrap: [RootComponent],
declarations: [RootComponent]
})
export class Ng2AppModule {
constructor(public upgrade: UpgradeModule) { }
}
我的“main.ts”如下:
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { setUpLocationSync } from '@angular/router/upgrade';
import { Ng2AppModule } from "./Angular2/app.rootcomponent";
// This is the entry point for the AngularJS/Angular hybrid application.
// It bootstraps the Angular module 'Ng2AppModule', which in turn bootstraps
// the AngularJS module 'angular1App'.
platformBrowserDynamic().bootstrapModule(Ng2AppModule).then(ref => {
const upgrade = (<any>ref.instance).upgrade;
// bootstrap angular1
upgrade.bootstrap(document.body, ['angular1App']);
setUpLocationSync(upgrade);
});
模块“MyModule”如下:
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { TestDataListComponent } from './testdata-list.component';
@NgModule({
imports: [
RouterModule.forChild([
{
path: 'Mymodule', children: [
{ path: 'testdata', component: TestDataListComponent }
]
}
])
],
declarations: [TestDataListComponent ]
})
export class MyModule {
}
而'TestDataListComponent'组件很简单:
import { Component } from '@angular/core';
@Component({
selector: 'test-data',
templateUrl: 'App/Angular2/MyModule/testdata-list.component'.html'
})
export class TestDataListComponent{
}
我链接到 Angular 2 组件的方式是在主菜单 HTML 页面中。相关代码如下:
<li id="main-menu" class="menu-top-level" ng-mouseover="cur = 'mymodule'">
<a ng-reflect-router-link="/Mymodule/testdata" href="#/Mymodule/testdata">
MyModule
<span>
<i class="fa fa-check-square fa-2x"></i>
</span>
</a>
</li>
我遇到的问题是点击上面的链接会进入一个空白视图,即组件 TestDataListComponent 没有显示。但是,如果我在我的主要 Angular 2 模块中替换以下行,即 Ng2AppModule:
RouterModule.forRoot([])
与:
RouterModule.forRoot([], { useHash: true, initialNavigation: false })
component TestDataListComponent 显示正常,但是当我尝试通过单击链接导航回 Angular 1 组件时,页面是空白的,我注意到我的 URL浏览器窗口如下所示:
虽然它应该是这样的:
如果我再次单击该链接,则 URL 正确,并且 Angular 1 组件显示正常。
我的 Angular 1 模块 angular1App 的相关部分是:
angular.module("angular1App",
["ngRoute",
"myInterceptorService",
"ngStorage",
"ngAnimate",
"ui.bootstrap",
"ngResource",
"SignalR",
"ui.select",
"ngSanitize"])
.config([
"$routeProvider", "$httpProvider", function($routeProvider, $httpProvider) {
$httpProvider.interceptors.push("myInterceptorService");
$routeProvider
.when('/myclients',
{
title: "Client Data",
controller: "clientDataCtrl",
templateUrl: "/App/Common/Views/clientData.html"
})
这里有什么问题?为什么我的 Angular 2 或 Angular 1 组件现在出现了?
【问题讨论】:
-
这是一个演示问题的 Plunker:plnkr.co/edit/JGzY1EhulDlrz7gjHxwY?p=preview
-
有类似的问题...遵循相同的指南....
-
有什么更新吗?自从你上次在这里活动?
-
是的,请查看以下链接以获取此问题的解决方案。 Brandonroberts 提供的 Plunker 为我工作:github.com/angular/angular/issues/18832
标签: javascript angularjs angular angular2-routing angular-hybrid