Функция использования Angular Router для получения маршрутов

Как я могу вызвать функцию в конфигурации маршрутов, чтобы установить дочерние маршруты в Angular 5? Пример кода:

export const homeRoutes: Routes = [
  {
    path: 'home',
    component: HomeContainer
    children: [
      getChildrenRoutes()
    ]
  }
]

@NgModule({
  imports: [
    RouterModule.forChild(homeRoutes),
  ],
  ...
})
export class HomeRoutingModule {}

Функция getChildrenRoutes() возвращает Route. В режиме JIT это работает хорошо, но если я делаю сборку AoT, выдает ошибку:

ERROR in Error: Произошла ошибка при статическом разрешении значений символов. Вызовы функций не поддерживаются. Рассмотрите возможность замены функции или лямбды ссылкой на экспортированную функцию...


person rimlin    schedule 19.01.2018    source источник
comment
Вызовы функций не поддерживаются.   -  person JB Nizet    schedule 19.01.2018
comment
Хм... проверил gist.github.com/chuckjaz/65dcc2fd5f4f5463e492ed0cb93bca60 и это правда. @JBNizet есть идеи, как установить объект маршрутов, где вызывается функция? Пробовал использовать router.resetConfig(homeRoutes) в конструкторе HomeRoutingModule, но с таким подходом я не могу ввести маршруты.   -  person rimlin    schedule 19.01.2018
comment
Пожалуйста, включите свой код для getChildrenRoutes() в вопрос   -  person Mark Leong    schedule 23.05.2018


Ответы (1)


сначала вам нужно настроить основную маршрутизацию на основной модели (NgModel). в отдельном классе (app.module.routing.ts) вы должны реализовать основную маршрутизацию с дочерними элементами. это будет ближе следующим образом

export const routes: Routes = [
  {
    path: '',
    redirectTo: 'dashboard',
    pathMatch: 'full',
  },
  {
    path:'login',
    component:LoginComponent
  },
  {
    path: '',
    component: FullLayoutComponent,
    data: {
      title: 'Home'
    },
    children: [
      {
        path: 'dashboard',
        loadChildren: './dashboard/dashboard.module#DashboardModule',
      },
      {
        path: 'auth',
        loadChildren: './auth/auth.module#AuthModule'
      },
      {
        path: 'masterdata',
        loadChildren: './masterdata/master.module#MasterModule'
      }
     
    ]
  },
];
@NgModule({
  imports: [ RouterModule.forRoot(routes)],  /*, { enableTracing: true }) */ 
  exports: [ RouterModule ],
  providers:[AuthGuard,OnlyLoggedInUsersGuard,GuardService]
})
export class AppRoutingModule {}

поэтому ожидается, что этот маршрут будет иметь еще 3 подмодуля 1.dashboard 2.auth 3.masterdata

поэтому вам может понадобиться создать папку для каждого модуля и иметь один основной NGModule и модуль маршрутизации для каждого. вот один из тех подмодулей

const routes: Routes = [
    {
        path:"",
        data:{
          title: "MasterData"
     },
        children:[
            {
                path:"apptypes",
                component:ApprovalTypesComponent,
                data:{
                    title:"Approval Types"
                },
                canActivate:[OnlyLoggedInUsersGuard,AuthGuard]
            }
        ]
    }
];

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

export class MasterRoutings{}

loadChildren: './masterdata/master.module#MasterModule'

эта строка загрузит подмодуль по пути "./masterdata/master.module", а модуль должен экспортировать класс MasterModule, поэтому angular загрузит все маршруты из этот класс и добавить в основную таблицу маршрутизации.

надеюсь это поможет спасибо

person H-a-Neo    schedule 19.01.2018