【问题标题】:Angular2 routing: can't access the data defined in routeAngular2路由:无法访问路由中定义的数据
【发布时间】:2017-01-17 11:21:12
【问题描述】:

我正在尝试使用this tutorial by Brian Love 创建一个面包屑组件

它要求您在路由data 中设置一个breadcrumb 键值对:

const routes: Routes = [{
    path: "",
    component: RootComponent,
    children: [{
            path: "signin",
            component: SigninComponent,
            data: {
                breadcrumb: "Sign In"
            }
        },
        {
            path: "signup",
            component: SignupComponent,
            data: {
                breadcrumb: "Sign Up"
            }
        },
        {
            path: "",
            component: IndexComponent
        }
    ]
}, ];

对于我的应用模块,它按预期工作。

但是,我有一个主模块,在用户从应用程序登录后延迟加载。这就是我想要面包屑的地方。

由于某种原因,我无法从我的延迟加载模块中访问 data,因此在 breadcrumb.component.ts 中满足此条件并破坏行为。

 if (!child.snapshot.data.hasOwnProperty(ROUTE_DATA_BREADCRUMB)) {
    continue;
}

任何想法为什么我无法在此处获取数据?

我的应用路由模块:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

import { TmLoginComponent } from './login/tm-login.component';
import { MainComponent } from './main/main.component';
import { AuthenticationGuard } from './login/authentication-guard';
import { PageNotFoundComponent } from './404/page-not-found.component';


const routes: Routes = [{
    path: '',
    loadChildren: 'app/main/main.module#MainModule',
    canActivate: [AuthenticationGuard],
}, {
    path: 'login',
    component: TmLoginComponent,
}, {
    path: 'home',
    redirectTo: '/',
    pathMatch: 'full',
}, {
    path: '**',
    component: PageNotFoundComponent
}];


@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})

export class AppRoutingModule {}

我的主路由模块(懒惰):

import { NgModule }             from '@angular/core';
import { ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import { MainComponent } from './main.component';
import { IndiaComponent } from './india/india.component';
import { MaharashtraComponent } from './india/maharashtra/maharashtra.component';
import { KarnatakaComponent } from './india/karnataka/karnataka.component';
import { PuneComponent } from './india/maharashtra/pune/pune.component';
import { MumbaiComponent } from './india/maharashtra/mumbai/mumbai.component';

const routes: Routes = [{
    path: '',
    component: MainComponent,
    data: {
        breadcrumb: 'Main'
    },
    children: [{
            path: 'india',
            component: IndiaComponent,
            data: {
                breadcrumb: 'India'
            },
            children: [{
                    path: 'maharashtra',
                    component: MaharashtraComponent,
                    data: {
                        breadcrumb: 'Maharashtra'
                    },
                    children: [{
                            path: 'pune',
                            component: PuneComponent,
                            data: {
                                breadcrumb: 'Pune'
                            },
                        },
                        {
                            path: 'mumbai',
                            component: MumbaiComponent,
                            data: {
                                breadcrumb: 'Mumbai'
                            }
                        },
                    ]
                },
                {
                    path: 'karnataka',
                    component: KarnatakaComponent,
                    data: {
                        breadcrumb: 'Karnataka'
                    }
                },
            ],
        },

    ]
}, ];

export const mainRouting: ModuleWithProviders = RouterModule.forChild(routes);

【问题讨论】:

    标签: angular angular2-routing


    【解决方案1】:

    ActivatedRoute 注入您的组件并订阅data 属性,因为它是BehaviorSubject

    export class MainComponent {
    
        constructor(private _activatedRoute: ActivatedRoute) {
            this._activatedRoute.data.subscribe(data => {
                console.log('data: ', data); // => { breadcrumb: 'Main' }
            });
        }
    }
    

    【讨论】:

    • 嗨。谢谢回答。根据您的建议,我可以访问我的 main 路由的数据,但子路由的数据仍未定义。
    • 嗨。按照相同的逻辑,为了访问子路由中定义的数据,您需要在子组件中注入 ActivatedRoute。
    • 好的,我在所有子组件中注入了ActivatedRoute,你的函数从各自的构造函数中正确记录了数据;但我仍然无法使用我的面包屑组件访问它。
    • 目前不直接支持访问除了自己的其他组件激活的路由数据。周围有一些“hacky”解决方案,此链接可能对您的用例有所帮助:stackoverflow.com/questions/38312417/…
    • 我正在使用 hacky 解决方案 :) 似乎不适合懒惰的模块
    猜你喜欢
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2016-09-04
    相关资源
    最近更新 更多