Невозможно связать с routerLink, так как это не известное свойство

145

Недавно начал играть с 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. Я был бы рад предоставить больше информации, если это необходимо.

Умайр Сарфраз
источник
Импортируйте RouteModule в корневой каталог вашего приложения и обновите последнюю стабильную версию пакета npm
harshes53
Да, у меня последняя стабильная версия.
Umair Sarfraz
2
Вы также добавили RouterModuleко imports: []всем модулям, которые вы используете, routerLinkили<router-outlet>
Günter Zöchbauer
Порядок модулей @Umair важен в импорте, переместимся AppRoutingModuleраньшеLayoutModule
harshes53
1
@ harshes53 Я не думаю, что это правда.
Гюнтер Цохбауэр

Ответы:

262

Вы должны добавить RouterModuleк importsкаждому, @NgModule()где компоненты используют любой компонент или директиву (в данном случае routerLinkи <router-outlet>.

declarations: [] это сделать компоненты, директивы, трубы, известные внутри текущего модуля.

exports: []сделать компоненты, директивы, трубы доступными для импортирующих модулей. То, что добавляется declarationsтолько является частным для модуля. exportsделает их публичными.

Смотрите также https://angular.io/api/router/RouterModule#usage-notes

Гюнтер Цохбауэр
источник
@Gunter нормально ли импортировать RouterModule несколько раз? Например, если я хочу использовать routerLink в childModule, мне нужно импортировать RouterModule в дочерний модуль, в то время как он уже был импортирован модулем корневого приложения ...
Оливье Буасе
Да, он будет включен только один раз в вывод сборки.
Гюнтер Цохбауэр
Хорошо, но я думаю, что нужно позаботиться о том, чтобы метод forRootвызывался только один раз, дочерние модули должны импортировать только RouterModule без вызова метода forRoot
Оливье Буасе,
Я думаю, что это зависит от того, что forRootделает. При регистрации провайдеров forRootнесколько раз, результат такой же, как если бы был сделан только один раз. Если вы делаете другие вещи, это не может быть иначе.
Гюнтер Цохбауэр
2
Спасибо за этот ответ! В моем случае приложение работало, но тесты не прошли. Решением было импортировать RouterTestingModule в тестах для каждого компонента, который использует routerLink.
Славик Шинкаренко
24

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

Убедитесь, что ваш package.json имеет это:

"@angular/router": "^3.3.1"

Затем в вашем app.module импортируйте роутер и настройте маршруты:

import { RouterModule } from '@angular/router';

imports: [
        RouterModule.forRoot([
            {path: '', component: DashboardComponent},
            {path: 'dashboard', component: DashboardComponent}
        ])
    ],

Обновление :

Переместите AppRoutingModule, чтобы быть первым в импорте:

imports: [
    AppRoutingModule.
    BrowserModule,
    FormsModule,
    HttpModule,
    AlertModule.forRoot(), // What is this?
    LayoutModule,
    UsersModule
  ],
Бен Ричардс
источник
Это не решило проблему. Можете ли вы проверить мое обновление?
Umair Sarfraz
@Ben - «forRoot ()» означает, что вы вызываете метод, определенный в импортированном модуле, который выполняет настройку или настройку для модуля. Вы также можете определить метод наподобие forChild () в пользовательском модуле и вызвать его, если хотите. Этот метод используется для таких задач, как настройка поставщика услуг. Это также, как вы получаете услугу Singleton в Angular. См. Angular.io/guide/singleton-services
RoboBear
10

Я добавлю еще один случай, когда я получал ту же ошибку, но был просто фиктивным. Я добавил, [routerLinkActiveOptions]="{exact: true}"еще не добавляя routerLinkActive="active".

Мой неверный код был

<a class="nav-link active" routerLink="/dashboard" [routerLinkActiveOptions]="{exact: true}">
  Home
</a>

когда это должно было быть

<a class="nav-link active" routerLink="/dashboard" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
  Home
</a>

Не имея routerLinkActive, вы не можете иметь routerLinkActiveOptions.

cchapman
источник
3

Когда ничего не работает, когда это должно работать, перезапустите ng serve. Грустно находить такого рода ошибки.

тюдоровский
источник
2
Может соответствовать, есть ошибка. Я просто продолжал удалять содержимое папки dist и перестраивать. Наконец-то это сработало. Попробуйте добавить ссылку на каждый компонент в app.component.ts. Если это не сработает, ваш единственный выбор - это молитва и пост.
Сэм
1

В моем случае мне просто нужно импортировать мой недавно созданный компонент в RouterModule

{path: 'newPath', component: newComponent}

Затем в вашем app.moduleимпорте маршрутизатор и настройте маршруты:

импортировать {RouterModule} из '@ angular / router';

imports: [
        RouterModule.forRoot([
            {path: '', component: DashboardComponent},
            {path: 'dashboard', component: DashboardComponent},
            {path: 'newPath', component: newComponent}
        ])
    ],

Надеюсь, это поможет кому-то !!!

Akitha_MJ
источник
1

Необходимо добавить RouterMoudleв importsразделы модуля, содержащие Headerкомпонент

Хунг Ву
источник