Неможливо прив’язати до "routerLink", оскільки це не відома властивість


145

Останнім часом я почав грати з кутовим 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 { }

app-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

user-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

Так, у мене є остання стабільна версія.
Умаїр Сарфраз

2
Ви також додати RouterModuleдо imports: []все модулів , де ви використовуєте routerLinkабо<router-outlet>
Гюнтер Zöchbauer

Замовлення модулів @Umair важливо в імпорті, рухайтесь AppRoutingModuleранішеLayoutModule
суворо5353

1
@ harshes53 Я не думаю, що це правда.
Günter Zöchbauer

Відповіді:


260

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

declarations: [] полягає в тому, щоб скласти компоненти, директиви, труби, відомі всередині поточного модуля.

exports: []полягає в тому, щоб компоненти, директиви, труби були доступні для імпорту модулів. Додано declarationsлише приватне модуль. exportsробить їх публічними.

Дивіться також https://angular.io/api/router/RouterModule#usage-notes


@Gunter це добре імпортувати RouterModule кілька разів? Наприклад, якщо я хочу використовувати routerLink в childModule, мені потрібно імпортувати RouterModule в дочірній модуль, тоді як він уже імпортований кореневим модулем програми ...
Olivier Boissé

Так, він буде включений лише один раз у висновок збірки.
Günter Zöchbauer

Гаразд, але я думаю, що нам потрібно подбати про те, щоб викликати метод forRootлише один раз, дитячі модулі повинні імпортувати RouterModule лише без виклику методу forRoot
Олів'є Бойсе

Я думаю, це залежить від того, що forRootробить. Під час реєстрації постачальників послуг forRootкілька разів, результат такий же, як якщо б це було зроблено лише один раз. Якщо ви робите інші речі, це може не відрізнятися.
Günter Zöchbauer

2
Дякую за цю відповідь! У моєму випадку додаток працювало, але тести не вдалися. Рішенням було імпортувати RouterTestingModule в тестах для кожного компонента, який використовує routerLink.
Славік Шинкаренко

24

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

Переконайтесь, що у пакунку.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
  ],

Це не вирішило питання. Чи можете ви, будь ласка, перевірити моє оновлення?
Умаїр Сарфраз

@Ben - "forRoot ()" означає, що ви викликаєте метод, визначений на імпортованому модулі, який виконує конфігурацію або налаштування для модуля. Ви також можете визначити метод на зразок "forChild ()" у спеціальному модулі та назвати його, якщо хочете. Цей метод використовується для таких завдань, як налаштування провайдера для послуги. Це також, як ви отримуєте послугу Singleton в кутовій. Дивіться 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.


3

Коли нічого іншого не працює, коли він повинен працювати, перезавантажте службу. Сумно знайти подібних помилок.


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}
        ])
    ],

Сподіваюся, це допоможе комусь !!!


1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.