Как перезагрузить текущий маршрут с помощью маршрутизатора angular 2
Я использую angular 2 со стратегией хэшлокации.
компонент загружен этим маршрутом:
"departments/:id/employees"
пока нормально.
после успешного пакетного сохранения нескольких строк отредактированной таблицы я хочу перезагрузить текущий url-адрес маршрута через:
this.router.navigate([`departments/${this.id}/employees`]);
но ничего не происходит, почему?
18 ответов
Если ваш navigate() не изменяет URL, который уже показан в адресной строке Вашего браузера, маршрутизатору нечего делать. Обновление данных не входит в обязанности маршрутизатора. Если вы хотите обновить данные, создайте службу, введенную в компонент, и вызовите функцию load в службе. Если новые данные будут получены, он обновит представление с помощью Привязок.
я нашел этот обходной путь на запросе функции GitHub для Angular:
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.деталь.ТС ngOnInit
функция, и это, конечно, сработало. Все дальнейшие клики по той же ссылке теперь перезагружают component
и данных.
ссылка на оригинальный запрос функции GitHub
заслуга mihaicux2 на GitHub.
я проверял это на версии 4.0.0-rc.3
С import { Router, NavigationEnd } from '@angular/router';
теперь это можно сделать в Angular 5.1 с помощью onSameUrlNavigation
свойства конфигурации маршрутизатора.
я добавил блог, объясняющий, как здесь, но суть его заключается в следующем
в конфигурации маршрутизатора включить установка 'reload'
. Это заставляет маршрутизатор запускать цикл событий при попытке перехода к маршруту это уже активно.
@ngModule({
imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})],
exports: [RouterModule],
})
в ваших определениях маршрута установите runGuardsAndResolvers
to 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();
}
}
}
со всеми этими шагами на месте, вы должны иметь маршрут перезагрузки включен.
сложновато: использовать тот же путь с некоторыми фиктивными параметрами. Например -
refresh(){
this.router.navigate(["/same/route/path?refresh=1"]);
}
создайте функцию в контроллере, которая перенаправляет на ожидаемый маршрут так
redirectTo(uri:string){
this.router.navigateByUrl('/DummyComponent', {skipLocationChange: true}).then(()=>
this.router.navigate([uri]));}
тогда используйте его так
this.redirectTo('//place your uri here');
эта функция перенаправит на фиктивный маршрут и быстро вернется к целевому маршруту без понимания пользователя.
угловой 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]);
});
}
для меня работает hardcoding с
this.router.routeReuseStrategy.shouldReuseRoute = function() {
return false;
// or
return true;
};
найдено быстрое и прямолинейное решение, которое не требует возиться с внутренней работой углового:
в основном: просто создайте альтернативный маршрут с тем же модулем назначения и просто переключайтесь между ними:
const routes: Routes = [
{
path: 'gesuch',
loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
},
{
path: 'gesuch-neu',
loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
}
];
и здесь меню toggeling:
<ul class="navigation">
<li routerLink="/gesuch-neu" *ngIf="'gesuch' === getSection()">Gesuch</li>
<li routerLink="/gesuch" *ngIf="'gesuch' !== getSection()">Gesuch</li>
</ul>
надеюсь, что это помогает :)
в моем случае:
const navigationExtras: NavigationExtras = {
queryParams: { 'param': val }
};
this.router.navigate([], navigationExtras);
работать правильно
реализуйте OnInit и вызовите ngOnInit () в методе для маршрута.navigate ()
пример :
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})
на странице перезагрузки изменения param не произойдет. Это действительно хорошая функция. Нет необходимости перезагружать страницу, но мы должны изменить значение компонента. метод 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) {
}
подписаться на изменения параметров маршрута
// 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'];
});
предположим, что маршрут компонента, который вы хотите обновить 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"
.
это сработало для меня:
let url = `departments/${this.id}/employees`;
this.router.navigated = false;
this.router.navigateByUrl(url);
перезагрузить текущий маршрут в angular 2 очень полезная ссылка для перезагрузки текущего маршрута в angualr 2 или 4
в этом определите две техники для этого
- С фиктивным запросом params
- с муляжами маршруту
Подробнее см. выше ссылку
просто используйте собственный метод перезагрузки javascript:
reloadPage() {
window.location.reload();
}