Angular 4+: элемент RouterLink в ‹a› элемент не работает должным образом

Я поместил свой AppRoutingModule внутрь imports из @NgModule класса AppModule.

AppRoutingModule определяется таким образом:

const APP_ROUTES : Routes = [
    { 
        path: '', 
        redirectTo: 'home', 
        pathMatch: 'full',
    },
    {
        path: 'home', 
        component: HomeComponent
    },
    {
        path: 'lesson-offers', 
        component: LessonOffersComponent
    },

    { path: '**', redirectTo: 'home' }
]

Я поместил <router-outlet></router-outlet> в app.component.html.

Страницы отображаются правильно на основе URL-адресов:

localhost:5000/  
localhost:5000/home  
localhost:5000/lesson-offers

Проблема в моем header.component.ts, где я пытаюсь добавить routerLink на домашнюю страницу. Я пробовал такие решения:

<img routerLink="home" ... />
<img [routerLink]="/home" ... />
<a routerLink="home"> <img ... /></a>
<a [routerLink]="home" ... ><img ... /></a>

Во-первых, когда я поместил routerLink в элемент <img>, такой директивы не было найдено. Затем в элементе <a> он делает случайный <a href="/home"> из routerLink и выполняет полную перезагрузку страницы! Разве не следует перезагружать только содержимое <router-outlet>?

Может быть, это имеет какое-то значение, что мой макет выглядит так:

// AppComponent HTML
<header-bar></header-bar>
<router-outlet></router-outlet>

а routerLink размещается в элементе в дочернем компоненте <header-bar> (логотип) и должен перемещаться по <router-outlet> в его родительском?

Но я также протестировал это поведение, используя routerLink, помещенный непосредственно внутри AppComonent, и ничего не изменилось! RouterLink по-прежнему перезагружает веб-страницу !:

<header-bar></header-bar>
<a routerLink="home">Home</a> 
<a routerLink="lesson-offers">Lesson Offers</a>
<a routerLink="page-not-found">Not Exsists</a>
<router-outlet></router-outlet>

person Michał Ziobro    schedule 06.05.2017    source источник
comment
У вас есть RouterModule, импортированный в модуль, который содержит header.component?   -  person Jan Giacomelli    schedule 06.05.2017
comment
Вы прочитали руководство по маршрутизации?   -  person jonrsharpe    schedule 06.05.2017
comment
‹A [routerLink visible=['/a4' visible› ‹/a› попробуйте что-нибудь в этом роде   -  person Rahul Singh    schedule 06.05.2017
comment
вы также можете убедиться, что base href установлен правильно.   -  person Isaiahiroko    schedule 06.05.2017
comment
У меня есть ‹base href = / /› в разделе заголовка HTML, когда я показываю исходный код страницы.   -  person Michał Ziobro    schedule 06.05.2017
comment
Мне тоже надоело что-то вроде этого: ‹a [routerLinkpting=['/home'ght› Главная ‹/a› и страница тоже перезагружается   -  person Michał Ziobro    schedule 06.05.2017
comment
Должна ли мигать кнопка перезагрузки браузера? Как смоделировать, перезагружается ли вся страница? Добавить тайм-аут в компонент заголовка или компонент приложения?   -  person Michał Ziobro    schedule 06.05.2017


Ответы (5)


Вам нужно больше, чтобы маршрутизация заработала. Вот как должен выглядеть ваш AppRoutingModule файл

import { RouterModule, Routes } from '@angular/router';
import { NgModule } from '@angular/core';
import { HomeComponent, LessonOffersComponent } from somewhere;

const APP_ROUTES : Routes = [
    { 
        path: '', 
        redirectTo: 'home', 
        pathMatch: 'full',
    },
    {
        path: 'home', 
        component: HomeComponent
    },
    {
        path: 'lesson-offers', 
        component: LessonOffersComponent
    },

    { path: '**', redirectTo: 'home' }
]

@NgModule({
  imports: [ RouterModule.forRoot(APP_ROUTES) ],
  exports: [ RouterModule ]
})
export class AppRoutingModule {}
person Meme Composer    schedule 06.05.2017
comment
У меня есть такой код, я его сократил и не включил определение класса. Маршрутизация работает т.е. - person Michał Ziobro; 06.05.2017
comment
Когда я набираю: localhost: 5000 / lesson-offer, он правильно перенаправляет. Но ссылки, сделанные с использованием routerLink =, похоже, вызывают перезагрузку всей страницы. - person Michał Ziobro; 06.05.2017
comment
Я думаю, что эта страница полностью перезагружена, потому что индикатор перезагрузки веб-браузера активируется и меняется на кнопку X - person Michał Ziobro; 06.05.2017
comment
Поскольку ваша конфигурация маршрута указывает перенаправление, когда путь совпадает с '' пустой строкой в ​​точности - person Meme Composer; 06.05.2017
comment
перенаправление заставляет браузер перезагружать страницу для перехода по указанному URL-адресу. - person Meme Composer; 06.05.2017
comment
Когда путь совпадает с lesson-offers, angular загружает компонент, связанный с этим путем маршрута, и вставляет его сразу после выхода, он не перезагружает страницу, как указано в вашей конфигурации маршрутизации. - person Meme Composer; 06.05.2017
comment
да, но я указал routeLink, как в моем сообщении выше: т.е. routerLink = home, поэтому он должен соответствовать path: 'home' и выбрать соответствующий компонент. - person Michał Ziobro; 06.05.2017
comment
Переместите path: '' чуть выше path: '**' и под все остальное - person Meme Composer; 06.05.2017

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

<a [routerLink]="['/home']" ... ><img ... /></a>

вместо этого:

<a [routerLink]="home" ... ><img ... /></a>
person Ojonugwa Jude Ochalifu    schedule 08.04.2020

Хорошо, я действительно нашел ошибку, и она была в том месте, о котором я никогда не предположу. Были также другие варианты поведения, такие как неработающие привязки событий (щелчок). Итак, я просматриваю конфигурации своего веб-проекта, основанного на этом примере универсального спа-центра angular 4 из github: https://github.com/MarkPieszak/aspnetcore-angular2-universal

  1. Я выполнил обновление с ASP NET Core SPA, созданного с помощью инструмента yeoman.

npm install -g yo generator-aspnetcore-spa

Затем перейдите в пустой каталог, в который вы хотите поместить свой проект, а затем запустите Yeoman следующим образом:

yo aspnetcore-spa
  1. Затем я заметил, что невозможно легко использовать Leaflet Open Street Maps при использовании предварительного рендеринга на стороне сервера.

  2. Итак, сделайте это обновление с Angular 2+ -> Angular 4+, купите изменение каждого файла конфигурации, модуля, загрузки, веб-пакета, tsconfig и т. Д. Файла. Я действительно был под большим впечатлением от этого начального проекта на github:
    https://github.com/MarkPieszak/aspnetcore-angular2-universal

  3. В конце дня я заметил, что у меня остался старый код, который, как я полагаю, будет работать правильно:

// boot.client.ts 
platform.destroy();
    });
} else {
    enableProdMode();
}

// Boot the application, either now or when the DOM content is loaded
const platform = platformUniversalDynamic();
const bootApplication = () => { platform.bootstrapModule(AppModule); };
if (document.readyState === 'complete') {
    bootApplication();
} else {
    document.addEventListener('DOMContentLoaded', bootApplication);
}

И в новой версии углового универсального проекта, который выглядит примерно так, должен быть правильный:

 modulePromise.then(appModule => appModule.destroy());
    });
} else {
    enableProdMode();
}

const modulePromise = 
 platformBrowserDynamic().bootstrapModule(BrowserAppModule);

PS. Раньше тоже делал замену platformUniversalDynamic => platformBrowserDynamic.

person Michał Ziobro    schedule 06.05.2017

По прошествии многих лет с момента последнего ответа мне было нелегко найти правильный ответ. Также я заметил несколько ошибочных ответов. Поэтому я хочу добавить четкое описание использования ссылки на маршрутизатор в HTML-файл компонента для Angular 8 ++. После добавления путей маршрутизатора в routingmodule, чтобы использовать эти маршруты в компоненте angular:

  1. Импортируйте RouterModule, для которого были объявлены компоненты модуля
  2. Установите маршрут к routerLink в HTML. Из-за чувствительности к регистру routerLink будьте осторожны, чтобы не использовать routerlink.

не нужно добавлять класс nav-link или импортировать маршрутизатор к вашему компоненту.

person whitefang    schedule 13.04.2020

Чтобы решить эту проблему, необходимо импортировать модуль RouterModule в импортированный модуль header.Component.ts. Это означает этот компонент родительского модуля. Затем запустите команду CLI ng serve

Например:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';

import { HeadComponent } from './head/head.component';


@NgModule({
  declarations: [HeadComponent],
  imports: [
    CommonModule,
    RouterModule,

  ],
  exports: [
    CommonModule,
    HeadComponent
  ]
})
export class LayoutModule { }

Это решение работало для моего приложения Angular 10

person Habib01    schedule 12.06.2021