RouterLink не працює


117

Моя маршрутизація в програмах angular2 працює добре. Але я збираюся зробити деякий маршрут Посилання на цьому :

Ось моя маршрутизація:

const routes: RouterConfig = [
    { path:'home' , component: FormComponent  },
    { path:'about', component: AboutComponent },
    { path:'**'   , component: FormComponent  }
];

І ось посилання, які я зробив:

<ul class="nav navbar-nav item">
                    <li>
                        <a routerLink='/home' routerLinkActive="active">Home</a>
                    </li>
                    <li>
                        <a routerLink='/about' routerLinkActive="active">About this</a>
                    </li>
</ul>

Я очікую, що коли я натискаю на них, він переходить до поважного компонента, але вони нічого не виконують?


Чи можете ви спробуйте [routerLink]='[/home']? Яку версію Angular2 та версію маршрутизатора ви використовуєте?
Günter Zöchbauer

це не працює. Ви впевнені в місці своїх пропозицій ?? Я думаю, що я використовую останню версію angular2, але я не знаю, як це перевірити. Я створив це з новим . і його слід оновити
Джефф

2
Вибачте, має бути[routerLink]="['/home']"
Günter Zöchbauer

2
Можливо, ви забули додати directives: [ROUTER_DIRECTIVES],метадані свого компонента. Без цього Angular не знатиме розбору routerLinks.
Марк Райчкок

Можливий дублікат каналу Angular2 Router не працює
isherwood

Відповіді:


321

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

Я підозрюю, що ваша проблема полягає в тому, що ви не імпортуєте RouterModule (саме там RouterLink оголошено) в модуль, який використовує цей шаблон.

У мене була подібна проблема, і мені знадобився певний час, щоб вирішити, оскільки цей крок не зазначений у документації.

Тому перейдіть до модуля, який оголошує компонент за допомогою цього шаблону та додайте:

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

потім додайте його до імпорту модулів, наприклад

@NgModule({
  imports: [
    CommonModule,
    RouterModule
  ],
  declarations: [MyTemplatesComponent]
})
export class MyTemplatesModule { }

Поряд з правильними заявами про імпорт, вам також потрібно буде вказати місце для цього routerLink, яке є в <router-outlet></router-outlet>елементі, так що його також потрібно розмістити десь у вашій розмітці HTML, щоб маршрутизатор знав, де відображати ці дані.


1
Я так подумав і так - ви і в моєму випадку абсолютно праві!
Dhananjay

1
Додавання модуля Router до мого імпорту зробило трюк, дякую!
ENDEESA

1
Працює для мене. Дуже дякую!
TheBosti

20

не забувайте це, щоб додати це нижче у свій шаблон:

<router-outlet></router-outlet>

9

Спробуйте змінити посилання, як показано нижче:

  <ul class="nav navbar-nav item">
    <li>
        <a [routerLink]="['/home']" routerLinkActive="active">Home</a>
    </li>
    <li>
        <a [routerLink]="['/about']" routerLinkActive="active">About this</a>
    </li>
  </ul>

Також додайте у заголовку index.html таке:

<base href="https://stackoverflow.com/">


5

використовуйте його так для інформації про mroe читайте цю тему

<a [routerLink]="['/about']">About this</a>

7
За вашим посиланням, його routerLinkповинно працювати ;-)
Günter Zöchbauer

Це працює для "@angular/router": "~3.4.0". Ура!
mikeym

2
Так, нотація дужок працює (і є дійсним синтаксисом з конкретною метою), але це питання не є вирішенням цього питання.
Ізервуд

1

Посилання неправильні. Ви повинні зробити це:

<ul class="nav navbar-nav item">
    <li>
        <a [routerLink]="['/home']" routerLinkActive="active">Home</a>
    </li>
    <li>
        <a [routerLink]="['/about']" routerLinkActive="active">About this
        </a>
    </li>
</ul>

Ви можете прочитати цей підручник


1
Нотація дужок служить іншій цілі і не вирішує цю проблему.
Ізервуд

це було все! <a [routerLinkSense=" evidence'/home'Sense" routerLinkActive="active"> Домашня сторінка </a> Я стежив за підручником, який змусив мене поставити routerLinkActive у тег <li>. коли я помістив його в <тег, він зараз працює! Велике дякую!!!! це чудово!
Річ П

До речі, у мене вже є всі інші теги / запропоновані елементи. Зараз ця функція працює (свого роду). Мені потрібно дотримуватися решти підручника, тому що я помічаю, що коли я вибираю інші рядки, навіть незважаючи на те, що значення для вибраного рядка передається (я бачу це в URL-адресі), відображається лише перший рядок. Але це буде інша тема. Ще раз дякую за цю чудову допомогу.
Річ П

Я не знаю чому, але коли я поставив Bracket, це працювало на мене, і я не імпортував RouterModule в свій модуль додатків ..
Cegone

1

Я використовував routerlink замість routerLink .


Я зробив цю помилку і це виправив! Я також не маю уявлення, чому вас заперечували (можливо, тому, що це міг бути замість цього коментар або тому, що він не відповідає безпосередньо на це конкретне питання?). Було б добре, якби люди, які виступають проти цього, могли б дати причину.
JoniVR

1

Мені відомо, що це питання вже досить давнє, і ви, швидше за все, вирішили це до цього часу, але я хотів би розмістити тут як посилання для тих, хто знайде цю публікацію під час усунення неполадок у тому, що ця річ перемогла Не працює, якщо ваші теги прив’язки знаходяться в Index.html. Він повинен бути в одному з компонентів


1

Для тих, хто має помилку після розбиття модулів, які перевіряють ваші маршрути, зі мною трапилось таке:

public-routing.module.ts:

const routes: Routes = [
    { path: '', component: HomeComponent },
    { path: '**', redirectTo: 'home' } // ← This was my mistake
    { path: 'home', component: HomeComponent },
    { path: 'privacy-policy', component: PrivacyPolicyComponent },
    { path: 'credits', component: CreditsComponent },
    { path: 'contact', component: ContactComponent },
    { path: 'news', component: NewsComponent },
    { path: 'presentation', component: PresentationComponent }
]

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class PublicRoutingModule { }

app-routing.module.ts:

const routes: Routes = [
];

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class AppRoutingModule { }

Перемістіться { path: '**', redirectTo: 'home' }до свого AppRoutingModule:

public-routing.module.ts:

const routes: Routes = [
    { path: '', component: HomeComponent },
    { path: 'home', component: HomeComponent },
    { path: 'privacy-policy', component: PrivacyPolicyComponent },
    { path: 'credits', component: CreditsComponent },
    { path: 'contact', component: ContactComponent },
    { path: 'news', component: NewsComponent },
    { path: 'presentation', component: PresentationComponent }
]

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class PublicRoutingModule { }

app-routing.module.ts:

const routes: Routes = [
    { path: '**', redirectTo: 'home' }
];

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class AppRoutingModule { }

1

Існує також інший випадок, який відповідає цій ситуації. Якщо в своєму перехоплювачі ви змусили його повернути не булеве значення, кінцевий результат такий.

Наприклад, я намагався повернути obj && obj[key]речі. Після налагодження на деякий час, то я розумію, що я повинен перетворити це на булевий тип вручну, як Boolean(obj && obj[key])щоб пропустити клацання.



1

Для таких не дуже гострих очей, як у мене, я hrefзамість цього routerLinkвзяв кілька пошуків, щоб зрозуміти, що це #facepalm.

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