Angular: импорт дочернего модуля в другой дочерний модуль перезаписывает маршруты последнего

У меня есть эта иерархия в моем приложении:

app/
    app.module.ts
    app.routing.ts
    ...
    endpoints/
              endpoints.module.ts
              endpoints.service.ts
              endpoints.routing.ts
              ...
    indexes/
              indexes.module.ts
              indexes.routing.ts
              ...

Содержит мои файлы маршрутизации:

app.routing.ts

...
export const AppRoutes: Routes = [{
    path: '',
    component: MainLayoutComponent,
    children: [{
            path: 'endpoints',
            loadChildren: './endpoints/endpoints.module#EndpointModule'
    },{
            path: 'indexes',
            loadChildren: './indexes/indexes.module#IndexModule'
    }
}];

endpoints.routing.ts

...
export const EndpointRoutes: Routes = [
    {    
        path: '',
        component: EndpointComponent
    }
];

indexes.routing.ts

...
export const IndexesRoutes: Routes = [
    {    
        path: '',
        component: IndexesComponent
    }
];

Это просто: когда я вызываю /endpoints/, вызывается EndpointComponent. То же самое для /indexes/ и IndexesComponent.

Теперь я хочу использовать службу конечных точек в моем модуле индексов. Я добавляю его в свой indexes.module.ts, который выглядит так:

...
import { EndpointsModule } from '../endpoints/endpoints.module';
import { EndpointsService } from '../endpoints/endpoints.service';

@NgModule({
    imports: [
        CommonModule,
        RouterModule.forChild(IndexRoutes),
        EndpointsModule,
        ...
    ],
    declarations: [ 
        IndexComponent
    ],
    providers: [
        EndpointService
    ]
})

export class IndexModule {}

Это компилируется нормально. Но теперь, когда я загружаю /indexes/, появляется представление для /endpoints/. Я предполагаю, что он также импортирует маршрутизацию из модуля конечных точек, но я еще не совсем понимаю, как работает импорт. Файлы основного модуля и модуля конечных точек выглядят следующим образом (показывая биты, связанные с маршрутизацией, поскольку я думаю, что они имеют отношение к моей проблеме):

app.module.ts

...
import { AppRoutes } from './app.routing';
...

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

endpoints.module.ts

...
import { EndpointRoutes } from './endpoints.routing';
...

@NgModule({
    ...
    imports: [

        RouterModule.forChild(EndpointRoutes),
        ...
    ],
})
export class EndpointModule {}

person Kilian Perdomo Curbelo    schedule 07.02.2018    source источник


Ответы (1)


Дело не столько в импорте модулей, сколько в перезаписи путей. В вашем первом примере у вас есть четкое различие: два разных модуля на разных подпутях.

Во втором примере вы говорите path: 'endpoints', затем ваш ленивый маршрутизатор добавляет маршрут для '' (который, в совокупности, разрешается в /endpoints, а затем этот модуль импортирует другой, который имеет то же самое, '' путь, так что все та же конечная точка.

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

person Zlatko    schedule 07.02.2018
comment
Добавляя маршруты, лениво загруженные из основного компонента приложения, вы имеете в виду добавление их непосредственно в основной файл маршрутизации в качестве дочерних элементов (вместо использования loadChildren)? - person Kilian Perdomo Curbelo; 07.02.2018
comment
Нет, ленивый означает loadChildren. - person Zlatko; 08.02.2018
comment
У меня наконец-то это заработало. Как сказал @Zlatko, это связано с перезаписью путей, но мне потребовалось некоторое время, чтобы найти решение. Если у кого-то есть эта проблема, этот ответ решает ситуацию -› stackoverflow.com/a/42707482/995014. В основном: 1) преобразуйте свои маршруты в модуль и экспортируйте их как класс 2) всегда импортируйте свои маршруты перед дочерним модулем. В этом ответе есть планкер, который показывает код. - person Kilian Perdomo Curbelo; 15.02.2018