我正在使用带有散列分配策略的angular 2。
该组件已加载该路由:
"departments/:id/employees"
到目前为止还好。
在成功批量保存多个已编辑表行之后,我想通过以下方式重新加载当前路由网址:
this.router.navigate([`departments/${this.id}/employees`]);
但是什么也没发生,为什么呢?
我正在使用带有散列分配策略的angular 2。
该组件已加载该路由:
"departments/:id/employees"
到目前为止还好。
在成功批量保存多个已编辑表行之后,我想通过以下方式重新加载当前路由网址:
this.router.navigate([`departments/${this.id}/employees`]);
但是什么也没发生,为什么呢?
Answers:
如果您的navigation()没有更改浏览器地址栏上已经显示的URL,则路由器没有任何关系。刷新数据不是路由器的工作。如果要刷新数据,请创建一个注入组件的服务,并在该服务上调用load函数。如果要检索新数据,它将通过绑定更新视图。
现在,可以使用onSameUrlNavigation
路由器配置的属性在Angular 5.1中完成此操作。
我添加了一个博客,解释了这里的操作方式,但要点如下
在您的路由器配置启用onSameUrlNavigation
选项中,将其设置为'reload'
。当您尝试导航到已处于活动状态的路由时,这将导致路由器触发事件循环。
@ngModule({
imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})],
exports: [RouterModule],
})
在您的路线定义中,将设置runGuardsAndResolvers
为always
。这将告诉路由器始终启动防护和解析器周期,并触发相关事件。
export const routes: Routes = [
{
path: 'invites',
component: InviteComponent,
children: [
{
path: '',
loadChildren: './pages/invites/invites.module#InvitesModule',
},
],
canActivate: [AuthenticationGuard],
runGuardsAndResolvers: 'always',
}
]
最后,在您要启用重新加载的每个组件中,您需要处理事件。这可以通过导入路由器,绑定到事件并调用初始化方法来完成,该方法可以重置组件的状态并在需要时重新获取数据。
export class InviteComponent implements OnInit, OnDestroy {
navigationSubscription;
constructor(
// … your declarations here
private router: Router,
) {
// subscribe to the router events. Store the subscription so we can
// unsubscribe later.
this.navigationSubscription = this.router.events.subscribe((e: any) => {
// If it is a NavigationEnd event re-initalise the component
if (e instanceof NavigationEnd) {
this.initialiseInvites();
}
});
}
initialiseInvites() {
// Set default values and re-fetch any data you need.
}
ngOnDestroy() {
if (this.navigationSubscription) {
this.navigationSubscription.unsubscribe();
}
}
}
完成所有这些步骤后,您应该已启用路由重载。
init
函数,
init
?
在控制器中创建一个函数,将其重定向到预期的路由,如下所示
redirectTo(uri:string){
this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
this.router.navigate([uri]));
}
然后像这样使用它
this.redirectTo('//place your uri here');
此功能将重定向到虚拟路由,并迅速返回到目标路由,而用户不会意识到。
'/'
的不是'/DummyComponent'
编辑
对于较新版本的Angular(5.1+),请使用@Simon McClive建议的答案
旧答案
我在针对Angular的GitHub功能请求中找到了此解决方法:
this._router.routeReuseStrategy.shouldReuseRoute = function(){
return false;
};
this._router.events.subscribe((evt) => {
if (evt instanceof NavigationEnd) {
this._router.navigated = false;
window.scrollTo(0, 0);
}
});
我尝试将其添加到我的app.component.ts ngOnInit
函数中,并且确实可以正常工作。现在,在同一链接上的所有其他点击都将重新加载component
和数据。
幸得mihaicux2 GitHub上。
我在版本4.0.0-rc.3
上测试了import { Router, NavigationEnd } from '@angular/router';
有点棘手:使用相同的路径和一些虚拟参数。例如-
refresh(){
this.router.navigate(["/same/route/path?refresh=1"]);
}
this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });
和route.queryParams.subscribe(val => myRefreshMethod())
其中route: ActivatedRoute
在刷新组件注入...希望它能帮助
我正在将这个用于Angular 9项目:
reloadCurrentRoute() {
let currentUrl = this.router.url;
this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {
this.router.navigate([currentUrl]);
});
}
PS:经过测试,也可以在“ Angular 7、8”上使用
Angular 2-4路由重新加载hack
对我来说,在根组件(任何路径中都存在的组件)内部使用此方法有效:
onRefresh() {
this.router.routeReuseStrategy.shouldReuseRoute = function(){return false;};
let currentUrl = this.router.url + '?';
this.router.navigateByUrl(currentUrl)
.then(() => {
this.router.navigated = false;
this.router.navigate([this.router.url]);
});
}
这对我来说就像魅力
this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
this.router.navigate([<route>]));
在参数更改上,不会发生重新加载页面。这确实是个好功能。无需重新加载页面,但我们应该更改组件的值。paramChange方法将调用URL更改。这样我们就可以更新组件数据
/product/: id / details
import { ActivatedRoute, Params, Router } from ‘@angular/router’;
export class ProductDetailsComponent implements OnInit {
constructor(private route: ActivatedRoute, private router: Router) {
this.route.params.subscribe(params => {
this.paramsChange(params.id);
});
}
// Call this method on page change
ngOnInit() {
}
// Call this method on change of the param
paramsChange(id) {
}
这就是我对Angular 9所做的。我不确定这是否适用于旧版本。
需要重新加载时,需要调用此方法。
this.router.navigate([], {
skipLocationChange: true,
queryParamsHandling: 'merge' //== if you need to keep queryParams
})
路由器forRoot需要将SameUrlNavigation设置为“重新加载”
RouterModule.forRoot(appRoutes, {
// ..
onSameUrlNavigation: 'reload',
// ..
})
而且您的每条路线都需要将runGuardsAndResolvers设置为“ always”
{
path: '',
data: {},
runGuardsAndResolvers: 'always'
},
据我所知,Angular 2中的路由器无法做到这一点。但是您可以这样做:
window.location.href = window.location.href
重新加载视图。
找到了一种快速而直接的解决方案,该解决方案不需要修改angular的内部工作原理:
基本上:只需使用相同的目标模块创建备用路由,然后在它们之间切换即可:
const routes: Routes = [
{
path: 'gesuch',
loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
},
{
path: 'gesuch-neu',
loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
}
];
这里是切换菜单:
<ul class="navigation">
<li routerLink="/gesuch-neu" *ngIf="'gesuch' === getSection()">Gesuch</li>
<li routerLink="/gesuch" *ngIf="'gesuch' !== getSection()">Gesuch</li>
</ul>
希望能帮助到你 :)
有点顽固,但
this.router.onSameUrlNavigation = 'reload';
this.router.navigateByUrl(this.router.url).then(() => {
this.router.onSameUrlNavigation = 'ignore';
});
就我而言:
const navigationExtras: NavigationExtras = {
queryParams: { 'param': val }
};
this.router.navigate([], navigationExtras);
工作正常
实现OnInit并在route.navigate()方法中调用ngOnInit()
看一个例子:
export class Component implements OnInit {
constructor() { }
refresh() {
this.router.navigate(['same-route-here']);
this.ngOnInit(); }
ngOnInit () {
}
通过使用虚拟组件和路由解决了类似的情况reload
,实际上可以做到redirect
。绝对不能涵盖所有用户方案,而仅适用于我的方案。
import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Http } from '@angular/http';
@Component({
selector: 'reload',
template: `
<h1>Reloading...</h1>
`,
})
export class ReloadComponent implements OnInit{
constructor(private router: Router, private route: ActivatedRoute) {
}
ngOnInit() {
const url = this.route.snapshot.pathFromRoot.pop().url.map(u => u.path).join('/');
this.router.navigateByUrl(url);
}
}
使用通配符将路由连接为捕获所有URL:
import { RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { LoginViewComponent } from './views/login/login.component';
import { HomeViewComponent } from './views/home/home.component';
import { ReloadComponent } from './views/reload/reload.component';
@NgModule({
declarations: [
LoginViewComponent, HomeViewComponent, ReloadComponent
],
imports: [
RouterModule.forRoot([
{ path: 'login', component: LoginViewComponent },
{ path: 'home', component: HomeViewComponent },
{
path: 'reload',
children: [{
path: '**',
component: ReloadComponent
}]
},
{ path: '**', redirectTo: 'login'}
])
],
exports: [
RouterModule,
],
providers: [],
})
export class AppRoutingModule {}
要使用此功能,我们只需要将重载添加到我们想去的URL:
this.router.navigateByUrl('reload/some/route/again/fresh', {skipLocationChange: true})
有多种方法可以刷新当前路线
更改路由器行为(自Angular 5.1起) 将路由器onSameUrlNavigation设置为“重新加载”。这将在同一URL导航上发出路由器事件。
保持路由器不变
我在https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e下写了更详细的解释
希望这可以帮助。
假设您要刷新的组件的路由为view
,然后使用以下命令:
this.router.routeReuseStrategy.shouldReuseRoute = function (future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot) {
if (future.url.toString() === 'view' && curr.url.toString() === future.url.toString()) {
return false;
}
return (future.routeConfig === curr.routeConfig);
};
您可以debugger
在方法中添加一个内部信息,以了解导航到后的确切路线是什么"departments/:id/employees"
。
我相信这已经在Angular 6+中解决了(本机)。检查
但这适用于整个路线(也包括所有子路线)
如果要定位单个组件,请执行以下操作:使用变化的查询参数,以便您可以随意导航多次。
导航点(类)
this.router.navigate(['/route'], {
queryParams: { 'refresh': Date.now() }
});
在您要“刷新/重新加载”的组件中
// . . . Component Class Body
$_route$: Subscription;
constructor (private _route: ActivatedRoute) {}
ngOnInit() {
this.$_route$ = this._route.queryParams.subscribe(params => {
if (params['refresh']) {
// Do Something
// Could be calling this.ngOnInit() PS: I Strongly advise against this
}
});
}
ngOnDestroy() {
// Always unsubscribe to prevent memory leak and unexpected behavior
this.$_route$.unsubscribe();
}
// . . . End of Component Class Body
非常令人沮丧的是,Angular 似乎仍然没有为此提供好的解决方案。我在这里提出了一个github问题:https : //github.com/angular/angular/issues/31843
同时,这是我的解决方法。它基于上面建议的其他一些解决方案,但我认为它更强大。它涉及将路由器服务包装在“ ReloadRouter
”中,该服务负责重新加载功能,还RELOAD_PLACEHOLDER
向核心路由器配置添加了。这用于临时导航,避免触发任何其他路线(或警卫)。
注意:仅ReloadRouter
在需要重新加载功能的情况下使用。Router
否则请使用普通纸。
import { Injectable } from '@angular/core';
import { NavigationExtras, Router } from '@angular/router';
@Injectable({
providedIn: 'root'
})
export class ReloadRouter {
constructor(public readonly router: Router) {
router.config.unshift({ path: 'RELOAD_PLACEHOLDER' });
}
public navigate(commands: any[], extras?: NavigationExtras): Promise<boolean> {
return this.router
.navigateByUrl('/RELOAD_PLACEHOLDER', {skipLocationChange: true})
.then(() => this.router.navigate(commands, extras));
}
}
导入Router
和ActivatedRoute
从@angular/router
import { ActivatedRoute, Router } from '@angular/router';
注入Router
并ActivatedRoute
(如果您需要从URL获得任何内容)
constructor(
private router: Router,
private route: ActivatedRoute,
) {}
如果需要,请从URL获取任何参数。
const appointmentId = this.route.snapshot.paramMap.get('appointmentIdentifier');
使用技巧,方法是导航到虚拟或主URL,然后导航到实际URL,以刷新组件。
this.router.navigateByUrl('/appointments', { skipLocationChange: true }).then(() => {
this.router.navigate([`appointment/${appointmentId}`])
});
const id= this.route.snapshot.paramMap.get('id');
this.router.navigateByUrl('/departments', { skipLocationChange: true }).then(() => {
this.router.navigate([`departments/${id}/employees`]);
});
如果您使用的是虚拟路由,那么如果您实现了未找到的网址(如果该网址与任何网址都不匹配),那么您会看到标题闪烁“未找到”。
订阅路由参数更改
// parent param listener ie: "/:id"
this.route.params.subscribe(params => {
// do something on parent param change
let parent_id = params['id']; // set slug
});
// child param listener ie: "/:id/:id"
this.route.firstChild.params.subscribe(params => {
// do something on child param change
let child_id = params['id'];
});
如果要通过路由器链接更改路由,请遵循以下步骤:
constructor(public routerNavigate: Router){
this.router.routeReuseStrategy.shouldReuseRoute = function () {
return false;
};
this.router.events.subscribe((evt) => {
if (evt instanceof NavigationEnd) {
this.router.navigated = false;
}
})
}
您应该在RouterModule中使用“ onSameUrlNavigation”属性,然后订阅路由事件 https://blog.angularindepth.com/refresh-current-route-in-angular-512a19d58f6e