sourcecode

angular 2 라우터를 사용하여 현재 루트를 새로고침하는 방법

codebag 2023. 4. 3. 21:29
반응형

angular 2 라우터를 사용하여 현재 루트를 새로고침하는 방법

와 angular 2를 .hashlocation★★★★★★ 。

컴포넌트는 다음 루트로 로드됩니다.

"departments/:id/employees"

아직까지는 괜찮아.

편집된 여러 테이블 행의 배치 저장을 정상적으로 수행한 후 다음을 통해 현재 루트 URL을 새로고침합니다.

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

하지만 아무 일도 일어나지 않아, 왜?

다음과 같이 예상되는 루트로 리다이렉트하는 함수를 컨트롤러에 만듭니다.

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

그럼 이렇게 쓰세요.

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

이 함수는, 더미 루트로 리다이렉트 해, 유저 자신도 모르는 사이에 행선지 루트로 재빠르게 돌아옵니다.

은 이제 5.에서 Angular 5.1을 할 수 .onSameUrlNavigation라우터 설정의 속성.

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

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',
 }
]

마지막으로 새로고침을 이노블로 하는 각 컴포넌트에서 이벤트를 처리해야 합니다.이를 수행하려면 라우터를 Import하여 이벤트에 바인드하고 컴포넌트 상태를 리셋하여 필요에 따라 데이터를 재취득하는 초기화 방식을 호출합니다.

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

이러한 순서를 모두 실시하면, 루트 새로고침을 유효하게 할 필요가 있습니다.

저는 Angular 11 프로젝트에 이것을 사용하고 있습니다.

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

PS: 7 이상의 모든 버전에서 테스트 및 동작.

편집

새로운 버전의 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에 크레딧이 돌아간다.

는 이것을 버전 는 version version version 에서 테스트했습니다.4.0.0-rc.3import { Router, NavigationEnd } from '@angular/router';

navigate()를 사용해도 브라우저의 주소 표시줄에 이미 표시된 URL이 변경되지 않으면 라우터는 아무것도 할 수 없습니다.데이터를 갱신하는 것은 라우터의 일이 아닙니다.데이터를 새로 고치려면 컴포넌트에 주입된 서비스를 생성하고 해당 서비스에서 로드 함수를 호출합니다.새 데이터가 검색될 경우 바인딩으로 보기를 업데이트합니다.

이게 앵글12에서 했던 거예요9 이하 버전에서는 동작하는지는 잘 모르겠습니다.

새로고침이 필요한 경우 이 명령을 호출해야 합니다.

 this.router.navigate([], {
    skipLocationChange: true,
    queryParamsHandling: 'merge' //== if you need to keep queryParams
  })

라우터 forRoot에서 SameUrlNavigation을 'reload'로 설정해야 합니다.

 RouterModule.forRoot(appRoutes, {
  // ..
  onSameUrlNavigation: 'reload',
  // ..
})

또한 모든 경로에서 runGuardsAndResolvers를 '항상'으로 설정해야 합니다.

{
    path: '',
    data: {},
    runGuardsAndResolvers: 'always'
},

이건 내게 마법처럼 통한다

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

조금 까다롭습니다.같은 경로를 사용하여 더미 파라미터를 설정합니다.예를 들면...

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

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

파라미터 변경 시 새로고침 페이지는 발생하지 않습니다.이거 정말 좋은 기능이에요.페이지를 새로고침할 필요는 없지만 컴포넌트 값을 변경해야 합니다.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) {

}

앵귤러 내부 작업을 손댈 필요가 없는 빠르고 간단한 솔루션을 찾았습니다.

기본적으로: 같은 행선지 모듈을 사용하여 대체 루트를 작성하고 이들 모듈을 전환하기만 하면 됩니다.

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.routeReuseStrategy.shouldReuseRoute = function() {
    return false;
    // or
    return true;
};

솔루션:

URL 매개 변수를 구독하고 구성 요소를 초기화합니다.트릭은 필요 없습니다.처음 로드를 포함한 "new URL --> new data" 입니다.

URL 파라미터의 경우(예:/persons/:id

constructor(protected activeRoute: ActivatedRoute, ...) {
    this.activeRoute.paramMap.subscribe(paramMap => {
        const id = paramMap.get('id');    // get param from dictonary
        this.load(id);                    // load your data
    });
}

URL 쿼리 파라미터의 경우(예:?q=...&returnUrl=...)(통상은 필수가 아닙니다):

    this.activeRoute.queryParamMap.subscribe(queryParamMap => {
        const returnUrl = queryParamMap.get('returnUrl');
        ...
    });

문제의 원인은 다음과 같습니다.

URL이 변경되면 Angular는 가능하면 이전 구성 요소를 재사용하여 컴퓨터 리소스를 절약합니다.데이터 로딩은 사용자 지정 코드이므로 Angular가 대신 할 수 없습니다.

입 가져오기Router ★★★★★★★★★★★★★★★★★」ActivatedRoute부에서@angular/router

import { ActivatedRoute, Router } from '@angular/router';

주 주입Router ★★★★★★★★★★★★★★★★★」ActivatedRoute( case)( you)(요)에서 필요한 경우)

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

더미 루트를 사용하는 경우 찾을 수 없는 URL을 구현한 경우 URL과 일치하지 않을 경우 제목 깜박임이 "Not Found"로 표시됩니다.

해결책은 다음과 같이 링크가 항상 새로고침되는 더미 파라미터(초단위 시간)를 전달하는 것입니다.

this.router.navigate(["/url", {myRealData: RealData, dummyData: (new Date).getTime()}])

조금 하드코어지만

this.router.onSameUrlNavigation = 'reload';
this.router.navigateByUrl(this.router.url).then(() => {

    this.router.onSameUrlNavigation = 'ignore';

});

route.navigate() 메서드에서 OnInit을 구현하고 ngOnInit()을 호출합니다.

예를 참조해 주세요.

export class Component implements OnInit {

  constructor() {   }

  refresh() {
    this.router.navigate(['same-route-here']);
    this.ngOnInit();   }

  ngOnInit () {

  }

미 포 컴 넌 트 트 용 사 나 결 해 했 습다 solved니 a시유를 and for오 component사 scenario한리여루하 by를 route더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 이후).SameUrlNavigation의 라우터를 'reload'로 설정합니다.이것에 의해, 같은 URL 네비게이션으로 라우터 이벤트가 송신됩니다.

  • 그런 다음 루트에 가입하여 처리할 수 있습니다.
  • runGuardsAndResolvers 조합과 함께 사용하여 해결 프로그램을 다시 실행할 수 있습니다.

라우터를 손대지 않은 채로 두다

  • URL의 현재 타임스탬프와 함께 refresh queryParam을 전달하고 라우팅된 컴포넌트의 queryParam에 서브스크라이브합니다.
  • router-outlet의 activate Event를 사용하여 루티드컴포넌트를 입수합니다.

자세한 설명은 https://medium.com/@kevinkreuzer/current-route-in-current-route-in-current-in-current-current-in-current-current-in-curret

이게 도움이 됐으면 좋겠다.

사용하고 있다setTimeout그리고.navigationByUrl이 문제를 해결하기 위해...그리고 그것은 나에게 잘 작동하고 있다.

다른 URL로 리디렉션되고 대신 현재 URL로 다시 전송됩니다.

 setTimeout(() => {
     this.router.navigateByUrl('/dashboard', {skipLocationChange: false}).then(() =>
           this.router.navigate([route]));
     }, 500)

Angular가 아직도 이에 대한 좋은 해결책을 제시하지 못한 것 같아 매우 실망스럽습니다.여기서 기트허브 문제를 제기했습니다.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));
  }
}

함수를 작성합니다(예:reloadCurrentPage.~하듯이windowAngular 컴포넌트에서 직접 재사용할 수 있는 글로벌 객체입니다.window.location.reload()는 현재 액티브한 페이지를 새로고침 합니다.

function reloadCurrentPage() {
    window.location.reload();
}

내 경우:

const navigationExtras: NavigationExtras = {
    queryParams: { 'param': val }
};

this.router.navigate([], navigationExtras);

올바르게 동작하다

새로고침할 컴포넌트의 경로가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".

값싸고 놀라운 방법이네요.

this.router.navigate([], {
    relativeTo: this.route,
    queryParams: {
        ...this.route.snapshot.queryParams,
        // replace 't' with any others not to conflict with exsiting
        // '2^11' prevents reloading in about 2 seconds
        t: Date.now() >> 11, 
        skipLocationChange: true,
    },
});

서브스크라이브, 루트 파라미터 변경

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

다음 코드가 작동합니다.

logoFn(url: any) {

    this.router.routeReuseStrategy.shouldReuseRoute = function () {
        return false;
    };
    this.router.navigate(['']); or
    this.router.navigate([url]);

}

이 문제는 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

루트를 저장할 타이밍을 결정합니다.false를 반환한다.

this.router.routeReuseStrategy.shouldReuseRoute = function () {
    return false;
};

라우터의 네비게이션 값을 false로 설정하면 이 루트가 라우팅되지 않았음을 알 수 있습니다.

this.mySubscription = this.router.events.subscribe(event => {
    if (event instanceof NavigationEnd) {
        this.router.navigated = false;
    }
});

언급URL : https://stackoverflow.com/questions/40983055/how-to-reload-the-current-route-with-the-angular-2-router

반응형