В Angular, как я непосредственно перемещаюсь по пути в ленивом загруженном модуле?

Я хотел бы иметь два пути верхнего уровня для входа в систему и регистрации.

Я бы предпочел не делать auth/log-in и auth/register.

Тем не менее, компоненты auth находятся в отдельном модуле, что хорошо, потому что он не должен быть загружен, если специально не запрошено.

export const routes: Route[] = [
  { path: 'log-in',   loadChildren: './auth-module/auth.module#AuthModule'},
  { path: 'register', loadChildren: './auth-module/auth.module#AuthModule'}
];

Как я могу определить, когда я определяю свои маршруты, которые я хочу log-in пути, чтобы перейти к log-in пути внутри ленивый загруженный AuthModule, и register пути идти в register пути внутри ленивый загруженный модуль?

Ответы

Ответ 1

export const routes: Route[] = [
  { path: 'log-in',   loadChildren: './auth-module/auth.module#AuthModule'},
  { path: 'register', loadChildren: './auth-module/auth.module#AuthModule'}
];

Я постараюсь сказать, что это невозможно. Lazy loading модули Lazy loading загруженные переадресацией. Это означает:

  • Начало навигации по log-in.
  • Ленивый загрузочный модуль начинает загружаться
  • После успешной загрузки URL-адрес будет иметь значение somePath/log-in
  • Итак, что дальше? Здесь начинается процесс перенаправления. Поэтому каждый ленивый модуль загрузки routing.ts должен содержать путь точки входа, например:

    {
       path: '',
       redirectTo: 'somePath/ChildPath' // or component: SomeComponent
    }
    

Не имеет значения, для какого маршрута он перемещался, если он ленивый модуль, тогда он попытается найти путь входа. В вашем случае два маршрута загружают один и тот же модуль, но также ссылаются на один и тот же маршрут маршрута входа (path: '').

Если вы действительно хотите их разделить, они должны выделяться в разных модулях.

export const routes: Route[] = [
  { path: 'log-in',   loadChildren: './auth-module/someModule#someModule'},
  { path: 'register', loadChildren: './auth-module/auth.module#AuthModule'}
];

некоторые-module.routing.ts:

{
    path: '',
    component: LoginComponent,

},

ОБНОВЛЕНИЕ 29.04.18. Простое решение с еще одним компонентом

Решение заключается в создании дополнительного компонента, который действует как средство визуализации других компонентов в зависимости от текущего url.

Приложение-routing.module:

const appRoutes: Routes = [
 ...

  {
    path: 'admin',
    loadChildren: 'app/admin/admin.module#AdminModule',

  },
  {
    path: 'login',
    loadChildren: 'app/admin/admin.module#AdminModule',

  },
  {
    path: 'crisis-center',
    loadChildren: 'app/crisis-center/crisis-center.module#CrisisCenterModule',
    // data: { preload: true }
  },
  { path: '', redirectTo: '/superheroes', pathMatch: 'full' },
  { path: '**', component: PageNotFoundComponent }
];

В admin.module создать компонент визуализации

central.component.ts:

...

@Component({
  selector: 'app-central',
  templateUrl: './central.component.html',
  styleUrls: ['./central.component.css']
})
export class CentralComponent implements OnInit {

  currentComponent: LoginComponent | AdminComponent;

  constructor(public router: Router, public activatedRoute: ActivatedRoute) { }

  ngOnInit() {
    if (this.router.url === '/login') {
      this.currentComponent = LoginComponent;
    } else {
      this.currentComponent = AdminComponent;
    }
  }
}

central.component.template:

<ng-container *ngComponentOutlet="currentComponent"></ng-container>

Итак, как вы можете видеть, центральный компонент будет динамически отображать компонент в зависимости от пути URL.

Для рендеринга используемого метода декларативного подхода с помощью NgComponentOutlet

Подробнее о императивном и декларативном подходе: fooobar.com/questions/7231160/...

Демо-версия StackBlitz

Ответ 2

До сих пор невозможно настроить маршруты, как вы хотели бы сделать в своем сообщении. Вы можете видеть, что если вы включите ведение журнала для своего маршрутизатора. Путь для вашего модуля (вход в систему, регистрация) потребляется, и в вашей маршрутизации модуля вы останетесь '' слева", что невозможно сопоставить с двумя разными компонентами.

Вы можете добиться этого, тем не менее, даже если это не так, и я не знаю, как это работает в старых браузерах.

В вашем app.module.ts

const APP_ROUTES: Routes = [
    { path: 'login', redirectTo: 'auth/login', pathMatch: 'full' },
    { path: 'register', redirectTo: 'auth/register', pathMatch: 'full' },
    { path: 'auth', loadChildren: 'app/auth/auth.module#AuthModule', pathMatch: 'prefix'},
];

@NgModule( {
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        RouterModule,
        RouterModule.forRoot(APP_ROUTES)
    ],
    providers: [
    ],
    bootstrap: [AppComponent]
})
export class AppModule { }

и auth.module.ts выглядит так

const ROUTES: Routes = [
    { path: 'login', component: LoginComponent, pathMatch: 'full' },
    { path: 'register', component: RegisterComponent, pathMatch: 'full' }
];

@NgModule( {
    imports: [
        CommonModule,
        RouterModule.forChild( ROUTES )
    ],
    declarations: [
        LoginComponent,
        RegisterComponent
    ]   
} )
export class AuthModule { }

Затем вы можете получить доступ к маршрутам через <a routerLink="login">Login</a>, также работает с router.navigate. К сожалению, это оставит вас с auth/login или auth/register в вашем браузере url, даже если клиент звонит просто /login.

Вы можете исправить это, создав запись в вашем window.history - как я уже сказал, не красивой, и это нужно сделать в конструкторе компонентов. window.history.pushState('register', 'Register', 'register'); или window.history.pushState('login', 'Login', 'login'); в компонентах останутся URL-адреса ваших браузеров с /login и /register.

Наилучшим способом было бы расширить угловой маршрутизатор с помощью этой функции и использовать его как настраиваемый маршрутизатор, но вам нужно будет в него поработать, и со следующим обновлением вы можете напортачить.

Может быть, это поможет вам

С наилучшими пожеланиями

Ответ 3

Модуль маршрутизации приложений может префикс (или нет) маршрутов модуля функций. Если вам не нужен префикс маршрута, например /auth, либо с использованием ленивой загрузки, либо нет), вы можете сделать что-то вроде этого:

приложение-routing.module.ts:

  {
    path:             '',
    canActivate:      [AuthGuard],
    canActivateChild: [AuthGuard],
    children:         [
      {
        path:      '',
        component: HomeComponent,
      },
      {
        path:         '',
        loadChildren: 'app/auth/auth.module#AuthModule',
      },
      {
        path:      'settings',
        component: SettingsComponent,
      },
    ],
  },

Верхний маршрут ленивого модуля не обязательно должен быть статичным, вы можете иметь такую конфигурацию, как:

Auth-routing.module.ts:

const routes: Routes = [
  {
    path:      ':pageName',
    component: AuthComponent,
    resolve:   {
      pageInfo: AuthResolver,
    },
    children:  [
      {
        path:      'login',
        component: LoginComponent,
      },
      {
        path:      'register',
        component: RegisterComponent,
      },
    ],
  },
];

Ответ 4

Вам нужно определить, что происходит, когда вы приходите к ленивому загруженному AuthModule. Сделайте это, создав/импортировав файл маршрутизации для своего AuthModule с помощью ModuleWithProviders. При необходимости могут быть добавлены маршруты для детей и роутеры.

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

export const authRoutes: Route[] = [

  { 
    path: '', 

 // path: '', redirects to children with no prefix in route
 // path: 'auth', prefix the route with 'auth' to create 'auth/log-in' 'auth/register'

    children: [                     
        { 
           path: 'log-in',
           component: LoginComponent,
          // outlet:'login' 
        },
        { 
            path: 'register', 
            component: RegisterComponent,
        //  outlet:'register' 
        },

        // redirects can be added to force the application to load your desired route 
       //{ path: '', redirectTo:'log-in' ,pathMatch:'full'},
    ]},
];
export const AuthRouting: ModuleWithProviders = RouterModule.forChild(authRoutes);

Затем ваш AuthModule импортирует этот файл маршрутизации.

//other imports
import {AuthRouting} from 'some/path/location';

@NgModule({
  imports: [
    CommonModule,
    AuthRouting,
    RouterModule
  ],