RouterLink не работает


118

Моя маршрутизация в приложениях angular2 работает хорошо. Но я собираюсь создать routeLink на основе этого :

Вот моя маршрутизация:

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 08

это не работает. вы уверены в месте ваших qutations ?? Я думаю, что использую последнюю версию angular2, но не знаю, как это проверить. Я создал его с помощью ng new . и он должен быть обновлен
Джефф

2
Извините, должно быть[routerLink]="['/home']"
Гюнтер Цохбауэр 08

2
Возможно, вы забыли добавить directives: [ROUTER_DIRECTIVES],к метаданным вашего компонента. Без этого Angular не сможет проанализировать routerLinks.
Марк Райкок 08

Возможный дубликат ссылки Angular2 Router не работает
isherwood

Ответы:


323

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

Я подозреваю, что ваша проблема в том, что вы не импортируете 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,

21

не забудьте это добавить в свой шаблон ниже:

<router-outlet></router-outlet>

10

Попробуйте изменить ссылки, как показано ниже:

  <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/">


6

используйте это так, чтобы получить больше информации прочтите эту тему

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

7
Согласно вашей ссылке, он routerLinkдолжен работать ;-)
Günter Zöchbauer 08

Это работает для "@angular/router": "~3.4.0". Ура!
mikeym

2
Да, скобка работает (и является допустимым синтаксисом для конкретной цели), но это не решение этого вопроса.
isherwood

3

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


2

Ссылки неверные, вы должны сделать это:

<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
Обозначение скобок служит другой цели и не решает эту проблему.
isherwood

это было оно! <a [routerLink ]="['/home'ght" routerLinkActive="active"> Home </a> Я следил за учебным курсом, в котором я поместил routerLinkActive в тег <li>. когда я поместил его в тег <a, теперь он работает! Большое спасибо!!!! это отлично!
Rich P

Кстати, у меня уже есть все остальные теги / предлагаемые элементы. Теперь эта функция работает (вроде как). Я должен следовать остальной части учебника, потому что я заметил, что когда я выбираю другие строки, даже если значение для выбранной строки передается (я вижу это в URL-адресе), отображается только первая строка. Но это будет уже другая тема. Еще раз большое спасибо за эту большую помощь.
Rich P

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

2

Для тех, у кого возникла эта ошибка после разделения модулей, проверьте ваши маршруты, со мной произошло следующее:

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

Я использовал routerlink вместо routerLink .


Я сделал эту ошибку, и это исправило ее! Я также не понимаю, почему вы были отклонены (возможно, потому, что это мог быть комментарий или потому, что он не дает прямого ответа на этот конкретный вопрос?). Было бы неплохо, если бы люди, которые проголосовали против, могли бы объяснить, почему.
JoniVR

1

Есть и другой случай, который подходит к этой ситуации. Если в вашем перехватчике вы заставили его возвращать не логическое значение, конечный результат будет таким.

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



1

Из-за не очень острых глаз, как у меня, hrefвместо этого routerLinkмне потребовалось несколько поисков, чтобы понять это #facepalm.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.