Angular에서 구성 요소를 새로 고치는 방법


84

Angular 프로젝트에서 일하고 있습니다. 구성 요소에서 새로 고침 작업에 어려움을 겪고 있습니다.

버튼 클릭시 라우터의 구성 요소를 새로 고침하고 싶습니다. 나는 그것을 클릭하면 새로 고침 버튼이 있습니다. 구성 요소 / 라우터를 새로 고쳐야합니다.

나는 시도 window.location.reload()하고 location.reload()이 두 내 필요에 적합하지 않습니다. 아는 사람이 있으면 도와주세요.


이 질문에서 코드를 공유 할 수 있습니까? 당신이 시도한 것.
Chandru

그것은 공유, 그것은 코드의 라인의 N 번호를 가지고, 어려운 복잡한 코드의
Sreehari Ballampalli에게

@Saurabh, 일반적으로 구성 요소를 다시로드 할 필요는 없습니다. 함수 (예 : "다시 시작"호출)를 갖고 새로 고침 버튼에서 함수를 호출 할 수 있습니다. 경로 또는 다른 서비스를 변경하기 위해 구독해야하는 경우 ngOnInit 함수를 사용하십시오. 구성 요소는 생성자가 아닌 OnInit-를 확장해야합니다
Eliseo

이것이 제가 Angular 9로 한 작업입니다. stackoverflow.com/a/60909777/1072395
Wlada

답변:


114

아래와 같이 내 코드를 조사하고 수정 한 후 스크립트가 저에게 효과적이었습니다. 방금 조건을 추가했습니다.

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

1
나는 이것을 주사 가능한 서비스에서 사용하고 있습니다. 나는 "your actualComponent"변수 로 대체 했습니다. 에 this.location.path()대한 호출 전에 변수가로 설정 됩니다 navigateByUrl. 이렇게하면 호출 구성 요소에서 매개 변수를 전달하거나 경로를 복제 / 전달할 필요가 없습니다.
Tewr

4
'RefrshComponent'와 'Your actualComponent'가 무엇인지 설명해 주시겠습니까?
reverie_ss

15
대부분의 사람들은 '/'where /RefrshComponentis를 사용해도 괜찮을 것이며 , [Your actualComponent"].NET과 같이 다시로드하려는 URL (및 / 또는 매개 변수)을 전달하기 만하면됩니다 this.router.navigate(["/items"]). 이 해킹은 기본적으로 최상위 URL로 리디렉션 된 다음, 대부분의 사용자에게 눈에 띄지 않는 의도 된 URL로 매우 빠르게 되돌아 가며이를 달성하기위한 가장 우아한 해킹으로 보입니다.
sofly

2
나는 이것이 확실히 작동해야한다는 데 동의하지만 내 앱에서 실패합니다 (Angular 6). '/'내 더미 경로로 사용하면 redirectTo내 app-routing.module.ts가 ''(빈 문자열) 경로에서 리디렉션 되고 중지되며 navigate()호출 의 완료 경로로 진행되지 않습니다 . 존재하지 않는 문자열 (예 :) /foo을 내 더미 경로로 사용하면 redirectTo내 app-routing.module.ts가 리디렉션하는 위치 (를 통해 )로 이동하고 **(다른 모든 항목) 실제 경로로 이동하지 않고 다시 중지됩니다. 흥미롭게도 URL 표시 줄이 실제 경로로 변경됩니다. 여기서 무엇이 다른지 생각하십니까?
Michael Sorens

1
신중하게 사용하지 않을 경우이 무한 리디렉션 루프가 발생할 수 있습니다
토마스 카츠을

64

this.ngOnInit (); 사용하십시오 . 전체 페이지를 다시로드하는 대신 동일한 구성 요소를 다시로드합니다 !!

DeleteEmployee(id:number)
  {
    this.employeeService.deleteEmployee(id)
    .subscribe( 
      (data) =>{
        console.log(data);

        this.ngOnInit();

      }),
      err => {
        console.log("Error");
      }   
  }

5
이것은 저자의 질문에 답할 수 있지만 설명하는 단어 및 / 또는 문서에 대한 링크가 부족합니다. 원시 코드 조각은 주변에 문구가 없으면 그다지 도움이되지 않습니다. 좋은 답변을 작성하는 방법이 매우 도움 이 될 수도 있습니다. 답변을 수정하십시오.
hellow

1
이것은 선택한 답변보다 더 나은 입력이지만 설명이 부족합니다. 특정 경우에는 하위 구성 요소를 새로 고쳐야했습니다. 이 경우 여러 가지 방법이 있지만 서비스를 사용하거나 부모에서 자녀에게 이벤트를 방송하는 것이 좋습니다.
Claudio

5
동의합니다. 구성 요소 내에서 구성 요소를 새로 고치려는 경우에만 작동합니다. 하위 / 외부 구성 요소를 처리하는 경우 this.ngOnInit ()가 작동하지 않습니다.
astro8891

3
구성 요소에 대해 작동하지만 양식 유효성 검사기를 재설정하지 않습니다.
비키 Gonsalves

1
완벽하게 작동합니다. 감사합니다. 그리고 AFAIC 설명과 관련하여 코드는 모든 것을 말합니다.
Marton Tatai

27

이것을 필요한 구성 요소의 생성자에 코드에 추가하면 저에게 효과적이었습니다.

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

this.mySubscription = this.router.events.subscribe((event) => {
  if (event instanceof NavigationEnd) {
    // Trick the Router into believing it's last link wasn't previously loaded
    this.router.navigated = false;
  }
});

있는지에 대한 확인 unsubscribe이에서 mySubscription 에서 ngOnDestroy().

ngOnDestroy() {
  if (this.mySubscription) {
    this.mySubscription.unsubscribe();
  }
}

자세한 내용은이 스레드를 참조하십시오-https: //github.com/angular/angular/issues/13831


15

다행히 Angular 5.1 이상을 사용하는 경우 기본 지원이 추가되었으므로 더 이상 해킹을 구현할 필요가 없습니다. RouterModule 옵션에서 onSameUrlNavigation을 'reload'설정하기 만하면됩니다 .

@ngModule({
 imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: ‘reload’})],
 exports: [RouterModule],
 })

자세한 내용은 여기에서 찾을 수 있습니다. https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2


router.onSameUrlNavigation = 'reload'주입 된 Router의 속성도 사용할 수 있습니다 .
0zkr PM dec.

4
앵귤러 6을 사용하면 아무런 차이가 없었습니다. 즉, 구성 요소가 다시로드되지 않았습니다. 그러나 허용되는 대답은 작동합니다.
Tewr

4
문서에서 완전히 명확하지는 않지만 onSameUrlNavigationGuards / Resolvers를 다시 호출하고 이미 라우팅 된 구성 요소를 다시로드하지 않습니다. 이에 대한 자세한 내용은 github.com/angular/angular/issues/21115 를 참조하십시오 . 이 솔루션은 Guards / Resolvers를 사용하는 더 크고 복잡한 애플리케이션에서 작동하지만 간단한 예제에서는 실패합니다.
sofly

1
네, onSameUrlNavigation 다시 탐색 이벤트를 발생하지만,이 구성 요소 다시로드하지 않습니다
폴 스토리

6

이것은 상자에서 약간 벗어난 것이며 이것이 도움이되는지 여부는 모르겠지만 시도해 보았습니다.

this.ngOnInit();

그것의 기능 그래서 당신이 그것에있는 모든 코드는 새로 고침처럼 호출됩니다.


3

그냥 이렇게 : (각도 9의 경우)

import { Inject } from '@angular/core';    
import { DOCUMENT } from '@angular/common';

constructor(@Inject(DOCUMENT) private document: Document){ }

someMethode(){ this.document.location.reload(); }

2
OPs 주석을 읽으십시오. 전체 페이지를 새로 고치는 것은 그를위한 옵션이 아닙니다. 처음에 각도를 갖는 목적을
무력화합니다

질문은 전체 페이지가 아닌 구성 요소를 다시로드하도록 요청합니다.
Santosh

2

이는 해킹을 통해 달성 할 수 있으며 일부 샘플 구성 요소로 이동 한 다음 다시로드 할 구성 요소로 이동합니다.

this.router.navigateByUrl('/SampleComponent', { skipLocationChange: true });
this.router.navigate(["yourLandingComponent"]);

SampleComponent는 내 프로젝트의 빈 구성 요소 또는 다른 구성 요소 여야 함을 의미합니까?
Sreehari Ballampalli

이 더미의 하나 여야, 비어있을 수 있습니다
Sajeetharan

좋아, 나는이 시도 할 것이다
Sreehari Ballampalli

사실이면 오류 메시지가 나타납니다. [ts] 유형 'true'에는 'NavigationExtras'유형과 공통된 속성이 없습니다.
Sreehari Ballampalli

: 업데이트 된 대답을 확인 @SreehariBallampalli, 당신은 객체 {사실 skipLocationChange} 전달해야
Sajeetharan

2

내 응용 프로그램에는 구성 요소가 있고 모든 데이터는 구성 요소의 생성자에서 호출하는 API에서 가져옵니다. 내 페이지 데이터를 업데이트하는 버튼이 있습니다. 버튼을 클릭하면 백엔드에 데이터를 저장하고 데이터를 새로 고칩니다. 따라서 내 요구 사항에 따라 구성 요소를 다시로드 / 새로 고침하는 것은 데이터를 새로 고치는 것뿐입니다. 이것이 또한 요구 사항이라면 구성 요소 생성자에 작성된 동일한 코드를 사용하십시오.


2

명시적인 경로가없는 또 다른 방법 :

async reload(url: string): Promise<boolean> {
  await this.router.navigateByUrl('.', { skipLocationChange: true });
  return this.router.navigateByUrl(url);
}

1

kdo

// reload page hack methode

push(uri: string) {
    this.location.replaceState(uri) // force replace and no show change
    await this.router.navigate([uri, { "refresh": (new Date).getTime() }]);
    this.location.replaceState(uri) // replace
  }

1
constructor(private router:Router, private route:ActivatedRoute ) { 
}

onReload(){
 this.router.navigate(['/servers'],{relativeTo:this.route})
}

0

html 파일

<a (click)= "getcoursedetails(obj.Id)" routerLinkActive="active" class="btn btn-danger">Read more...</a>

ts 파일

  getcoursedetails(id)
  { 
  this._route.navigateByUrl('/RefreshComponent', { skipLocationChange: true }).then(() => {
    this._route.navigate(["course",id]);
  }); 

-3

이와 같이 각도 2의 페이지를 새로 고치는 다른 방법 은 f5처럼 보입니다.

import { Location } from '@angular/common';

constructor(private location: Location) {}

pageRefresh() {
   location.reload();
}

1
그는 전체 페이지를 다시로드하는 것은 적합하지 않다고 말했습니다. 이것은 단일 / 다중 구성 요소뿐만 아니라 전체 페이지를 다시로드합니다.
Milan Velebit

각도 위치 서비스가 다시로드되지 않는 것을 제외하고는 이것을 사용하여 결국 창을 사용했습니다.
Paul Story
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.