【问题标题】:Angular 1 and Angular 2 Hybrid Application Routing Issue (angular component not displaying)Angular 1 和 Angular 2 混合应用程序路由问题(角度组件不显示)
【发布时间】:2017-12-14 17:26:15
【问题描述】:

我有一个使用以下指南设置的 Angular 1 和 Angular 2 混合应用程序,Upgrading from AngularJSMigrating 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浏览器窗口如下所示:

http://localhost:60813/#/

虽然它应该是这样的:

http://localhost:60813/#/myclients

如果我再次单击该链接,则 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 组件现在出现了?

【问题讨论】:

标签: javascript angularjs angular angular2-routing angular-hybrid


【解决方案1】:

您的组件问题似乎在这里:

import { Component } from '@angular/core';

@Component({
    selector: 'test-data',
    templateUrl: 'App/Angular2/MyModule/testdata-list.component'.html'
})
export class TestDataListComponent{

}

你需要添加正确的templateUrl字符串

【讨论】:

  • 请看我的回答以及我上面的评论。尽管我忘记在这里发布官方答案,但不久前就解决了这个问题。
【解决方案2】:

该解决方案由 Brandonroberts 在 Angular github 上提供。详情请看本期https://github.com/angular/angular/issues/18832

解决方案摘录:“setupLocationSync 向路由器提供用于导航的 URL 的方式不适用于基于散列的路由。我所做的是调整 setupLocationSync 的源以从散列传递 URL 以进行导航. 这样,Router 将正确处理两种情况的导航。”

有关详细信息,请参阅上述问题中的 Plunker。

【讨论】:

    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 2018-10-13
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多