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

raj_just123
источник
6

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

<a [routerLink]="['/about']">About this</a>
rashfmnb
источник
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 { }
Emerica
источник
1

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

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

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

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

Джиахуа Чжан
источник
1

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

Арагорн
источник