[angular] 각도 2 라우터로 현재 경로를 다시로드하는 방법

해시 위치 전략과 함께 각도 2를 사용하고 있습니다.

구성 요소는 해당 경로로로드됩니다.

"departments/:id/employees"

지금까지는 괜찮습니다.

여러 개의 편집 된 테이블 행을 성공적으로 일괄 저장 한 후 다음을 통해 현재 경로 URL을 다시로드하려고합니다.

this.router.navigate([`departments/${this.id}/employees`]);

그러나 아무 일도 일어나지 않는 이유는 무엇입니까?



답변

navigate ()가 브라우저의 주소 표시 줄에 이미 표시된 URL을 변경하지 않으면 라우터는 아무 작업도 수행하지 않습니다. 데이터를 새로 고치는 것은 라우터의 일이 아닙니다. 데이터를 새로 고치려면 구성 요소에 삽입 된 서비스를 작성하고 서비스에서로드 기능을 호출하십시오. 새 데이터가 검색되면 바인딩을 통해보기가 업데이트됩니다.


답변

이제 onSameUrlNavigation라우터 구성 의 속성을 사용하여 Angular 5.1에서 수행 할 수 있습니다 .

여기에 방법을 설명하는 블로그를 추가했지만 그 요지는 다음과 같습니다.

https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2

라우터 구성 활성화 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();
   }
 }
}

이러한 모든 단계가 완료되면 경로 다시로드가 활성화되어 있어야합니다.


답변

컨트롤러에서 예상 경로로 리디렉션하는 함수를 만듭니다.

redirectTo(uri:string){
   this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
   this.router.navigate([uri]));
}

다음과 같이 사용하십시오

this.redirectTo('//place your uri here');

이 기능은 더미 경로로 리디렉션되고 사용자가 모르게 목적지 경로로 빠르게 돌아갑니다.


답변

편집하다

최신 버전의 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및 데이터 가 다시로드 됩니다.

원래 GitHub 기능 요청에 연결

크레딧은 GitHub 에서 mihaicux2 로갑니다 .

나는 이것을 버전 4.0.0-rc.3으로 테스트 했다.import { Router, NavigationEnd } from '@angular/router';


답변

조금 까다로운 : 일부 더미 매개 변수와 동일한 경로를 사용하십시오. 예를 들어

refresh(){
  this.router.navigate(["/same/route/path?refresh=1"]);
}


답변

Angular 9 프로젝트에 이것을 사용하고 있습니다 :

reloadCurrentRoute() {
    let currentUrl = this.router.url;
    this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {
        this.router.navigate([currentUrl]);
    });
}

PS : “Angular 7, 8″에서도 테스트 및 작동


답변

각도 2-4 경로 재로드 핵

나 에게이 방법을 루트 구성 요소 (라우트에있는 구성 요소) 내부에서 사용하면 작동합니다.

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]);
    });
  }