Недавно начал играть с angular 2. Пока все круто. Итак, я начал демонстрационный личный проект, чтобы научиться пользоваться angular-cli
.
С базовой настройкой маршрутизации я теперь хочу перейти к некоторым маршрутам из заголовка, но поскольку мой заголовок является родительским для объекта router-outlet
, я получаю эту ошибку.
app.component.html
<app-header></app-header> // Trying to navigate from this component
<router-outlet></router-outlet>
<app-footer></app-footer>
header.component.html
<a [routerLink]="['/signin']">Sign in</a>
Теперь я частично понимаю, я предполагаю, что, поскольку этот компонент является оболочкой, router-outlet
доступ к нему будет невозможен router
. Итак, есть ли возможность получить доступ к навигации извне для подобного сценария?
Я был бы очень рад добавить дополнительную информацию, если потребуется. Заранее спасибо.
Обновить
1- У меня package.json
уже есть стабильная @angular/router 3.3.1
версия. 2- В моем основном app
модуле я импортировал routing-module
. Пожалуйста, смотрите ниже.
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AlertModule } from 'ng2-bootstrap';
import { LayoutModule } from './layout/layout.module';
import { UsersModule } from './users/users.module';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { PageNotFoundComponent } from './shared/components/not-found.component';
@NgModule({
declarations: [
AppComponent,
PageNotFoundComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
AlertModule.forRoot(),
LayoutModule,
UsersModule,
AppRoutingModule --> This is the routing module.
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
приложение-routing.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { SigninComponent } from './users/signin/signin.component';
import { PageNotFoundComponent } from './shared/components/not-found.component';
const routes: Routes = [
{ path: '**', component: PageNotFoundComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule {}
Маршрут, к module
которому я пытаюсь получить доступ, делегирован от другогоUsersModule
пользовательский routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { SigninComponent } from './signin/signin.component';
const usersRoutes: Routes = [
{ path: 'signin', component: SigninComponent }
];
@NgModule({
imports: [
RouterModule.forChild(usersRoutes)
],
exports: [
RouterModule
]
})
export class UsersRoutingModule { }
Пока я пытаюсь перейти от компонента, который является частью Layout
модуля, но не имеет понятия о модуле маршрутизатора. Это то, что вызывает ошибку.
Layout.module.ts
import { NgModule } from '@angular/core';
import { HeaderComponent } from './header/header.component';
import { FooterComponent } from './footer/footer.component';
@NgModule({
declarations: [HeaderComponent, FooterComponent],
exports: [HeaderComponent, FooterComponent]
})
export class LayoutModule{}
Я пытаюсь перейти от HeaderComponent
. Я был бы рад предоставить больше информации, если это необходимо.
источник
RouterModule
коimports: []
всем модулям, которые вы используете,routerLink
или<router-outlet>
AppRoutingModule
раньшеLayoutModule
Ответы:
Вы должны добавить
RouterModule
кimports
каждому,@NgModule()
где компоненты используют любой компонент или директиву (в данном случаеrouterLink
и<router-outlet>
.declarations: []
это сделать компоненты, директивы, трубы, известные внутри текущего модуля.exports: []
сделать компоненты, директивы, трубы доступными для импортирующих модулей. То, что добавляетсяdeclarations
только является частным для модуля.exports
делает их публичными.Смотрите также https://angular.io/api/router/RouterModule#usage-notes
источник
forRoot
вызывался только один раз, дочерние модули должны импортировать только RouterModule без вызова метода forRootforRoot
делает. При регистрации провайдеровforRoot
несколько раз, результат такой же, как если бы был сделан только один раз. Если вы делаете другие вещи, это не может быть иначе.Вам не хватает либо включения пакета маршрута, либо включения модуля маршрутизатора в модуль основного приложения.
Убедитесь, что ваш package.json имеет это:
Затем в вашем app.module импортируйте роутер и настройте маршруты:
Обновление :
Переместите AppRoutingModule, чтобы быть первым в импорте:
источник
Я добавлю еще один случай, когда я получал ту же ошибку, но был просто фиктивным. Я добавил,
[routerLinkActiveOptions]="{exact: true}"
еще не добавляяrouterLinkActive="active"
.Мой неверный код был
когда это должно было быть
Не имея
routerLinkActive
, вы не можете иметьrouterLinkActiveOptions
.источник
Когда ничего не работает, когда это должно работать, перезапустите ng serve. Грустно находить такого рода ошибки.
источник
В моем случае мне просто нужно импортировать мой недавно созданный компонент в RouterModule
Затем в вашем
app.module
импорте маршрутизатор и настройте маршруты:импортировать {RouterModule} из '@ angular / router';
Надеюсь, это поможет кому-то !!!
источник
Необходимо добавить
RouterMoudle
вimports
разделы модуля, содержащиеHeader
компонентисточник