Angular 5 RouterLink 不适用于相同路径但不同参数
Angular 5 RouterLink does not work with same path but different parameters
我有一个带有接受参数的 RouterLink 元素的锚元素。这些参数是导航到正确页面所必需的。现在,当我从不同的路径导航页面时,路由器 link 可以工作。例如我的路由器模块看起来像这样:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { MoviesComponent } from './movies/movies.component';
import { MovieReviewComponent } from './movie-review/movie-review.component';
import { LoginComponent } from './login/login.component';
import { AdminComponent } from './admin/admin.component';
const routes: Routes = [
{ path: '', component: MoviesComponent },
{ path: 'movies', component: MoviesComponent },
{ path: 'movies/:movieTitle/:year', component: MovieReviewComponent },
{ path: 'login', component: LoginComponent },
{ path: 'admin', component: AdminComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
而且我有一个位于路由器出口外的导航组件,如下所示:
<app-navigation></app-navigation>
<app-messages></app-messages>
<div id="main-layout" class="row p-3">
<section class="col-12 col-xm-12 col-md-3">hi</section>
<section class="col-12 col-xm-12 col-md-6">
<router-outlet></router-outlet>
</section>
<section class="col-12 col-xm-12 col-md-3">lo</section>
</div>
我的导航有一个搜索栏,它使用 RouterLink 路由到路径 'movies/:movieTitle/:year'
,只要我来自不同于 'movies/:movieTitle/:year'
的路径,它就可以工作。如果路径相似,即使 movieTitle 和年份参数不同,angular 也不会重新呈现。
例如,如果我在家 '/'
或 'movies'
,我可以使用导航栏成功转到 'movies/The%20Dark%20Knight/2008'
。但是如果我在 'movies/The%20Dark%20Knight/2008'
,我就不能使用导航栏去 '/movies/Taken/2008'
。我相信这与 Angular 试图减少相似路径的重新渲染有关,但是当相同的路径类型具有不同的参数时,如何让 Angular 更改视图?
额外信息
- 即使路由无法呈现新视图,浏览器中的路径 url 也会发生变化,当页面更改成功时,它是相同的 url
- 我的导航组件中有 angular 个导航事件。我可以确认导航开始并且没有导航错误。还是要测试是否取消。
回答
正如答案所说,我需要订阅参数。以前,当我获取参数时,我使用的是快照:
movieTitle = this.route.snapshot.paramMap.get('movieTitle');
现在我直接获取参数并订阅它们:
this.route.params.subscribe(params => {
this.movieService.getMovie(params['movieTitle'], params['year'])
.subscribe(movie => {
this.movie = movie
})
})
具有空路径且没有子项的路由应该具有路径匹配:'full'
{ path: '', component: MoviesComponent, pathMatch: 'full' },
路线的顺序也很重要。
更具体的路线应该放在第一位:
{ path: 'movies/:movieTitle/:year', component: MovieReviewComponent },
{ path: 'movies', component: MoviesComponent },
如果只有路由参数发生变化,但路由保持不变,Angular 会重用该组件。您需要订阅参数以获取有关更改的通知。 URL 仍在更新。
正如 @Günter Zöchbauer
在他的回答中所说,您需要订阅 params
才能收到有关更改的通知。这是您可以做到的方法...
假设您在 OrderDetailComponent
中,并且想要显示特定订单的详细信息,该订单的 ID 存在于 URL 中,例如 /orders/1
并正确显示如果 ID 更改为 /orders/2
、/orders/3
,则顺序正确...这是执行该操作的代码...
// order-detail.component.ts file
export class OrderDetailComponent implements OnInit {
constructor(private activatedRoute: ActivatedRoute) { }
ngOnInit() {
// Subscribing to the route params is important as it fixes an issue as
// Angular RouterLink may not work with same path but different params
this.activatedRoute.params.subscribe(params => {
console.log('URL Params', params);
this.getOrder(+params.id);
});
}
getOrder(id: number) {
// Your code to get the order with the provided id...
}
}
我有一个带有接受参数的 RouterLink 元素的锚元素。这些参数是导航到正确页面所必需的。现在,当我从不同的路径导航页面时,路由器 link 可以工作。例如我的路由器模块看起来像这样:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { MoviesComponent } from './movies/movies.component';
import { MovieReviewComponent } from './movie-review/movie-review.component';
import { LoginComponent } from './login/login.component';
import { AdminComponent } from './admin/admin.component';
const routes: Routes = [
{ path: '', component: MoviesComponent },
{ path: 'movies', component: MoviesComponent },
{ path: 'movies/:movieTitle/:year', component: MovieReviewComponent },
{ path: 'login', component: LoginComponent },
{ path: 'admin', component: AdminComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
而且我有一个位于路由器出口外的导航组件,如下所示:
<app-navigation></app-navigation>
<app-messages></app-messages>
<div id="main-layout" class="row p-3">
<section class="col-12 col-xm-12 col-md-3">hi</section>
<section class="col-12 col-xm-12 col-md-6">
<router-outlet></router-outlet>
</section>
<section class="col-12 col-xm-12 col-md-3">lo</section>
</div>
我的导航有一个搜索栏,它使用 RouterLink 路由到路径 'movies/:movieTitle/:year'
,只要我来自不同于 'movies/:movieTitle/:year'
的路径,它就可以工作。如果路径相似,即使 movieTitle 和年份参数不同,angular 也不会重新呈现。
例如,如果我在家 '/'
或 'movies'
,我可以使用导航栏成功转到 'movies/The%20Dark%20Knight/2008'
。但是如果我在 'movies/The%20Dark%20Knight/2008'
,我就不能使用导航栏去 '/movies/Taken/2008'
。我相信这与 Angular 试图减少相似路径的重新渲染有关,但是当相同的路径类型具有不同的参数时,如何让 Angular 更改视图?
额外信息
- 即使路由无法呈现新视图,浏览器中的路径 url 也会发生变化,当页面更改成功时,它是相同的 url
- 我的导航组件中有 angular 个导航事件。我可以确认导航开始并且没有导航错误。还是要测试是否取消。
回答
正如答案所说,我需要订阅参数。以前,当我获取参数时,我使用的是快照:
movieTitle = this.route.snapshot.paramMap.get('movieTitle');
现在我直接获取参数并订阅它们:
this.route.params.subscribe(params => {
this.movieService.getMovie(params['movieTitle'], params['year'])
.subscribe(movie => {
this.movie = movie
})
})
具有空路径且没有子项的路由应该具有路径匹配:'full'
{ path: '', component: MoviesComponent, pathMatch: 'full' },
路线的顺序也很重要。 更具体的路线应该放在第一位:
{ path: 'movies/:movieTitle/:year', component: MovieReviewComponent },
{ path: 'movies', component: MoviesComponent },
如果只有路由参数发生变化,但路由保持不变,Angular 会重用该组件。您需要订阅参数以获取有关更改的通知。 URL 仍在更新。
正如 @Günter Zöchbauer
在他的回答中所说,您需要订阅 params
才能收到有关更改的通知。这是您可以做到的方法...
假设您在 OrderDetailComponent
中,并且想要显示特定订单的详细信息,该订单的 ID 存在于 URL 中,例如 /orders/1
并正确显示如果 ID 更改为 /orders/2
、/orders/3
,则顺序正确...这是执行该操作的代码...
// order-detail.component.ts file
export class OrderDetailComponent implements OnInit {
constructor(private activatedRoute: ActivatedRoute) { }
ngOnInit() {
// Subscribing to the route params is important as it fixes an issue as
// Angular RouterLink may not work with same path but different params
this.activatedRoute.params.subscribe(params => {
console.log('URL Params', params);
this.getOrder(+params.id);
});
}
getOrder(id: number) {
// Your code to get the order with the provided id...
}
}