Cách làm mới một thành phần trong Angular


84

Tôi đang làm việc trên một dự án Angular. Tôi đang vật lộn với hành động làm mới trong một thành phần.

Tôi muốn làm mới các thành phần của bộ định tuyến khi nhấp vào nút. Tôi có nút làm mới khi tôi nhấp vào nó, thành phần / bộ định tuyến cần được làm mới.

Tôi đã thử window.location.reload()location.reload()hai cái này không phù hợp với nhu cầu của tôi. Xin vui lòng giúp đỡ nếu bất cứ ai biết về nó.


Bạn có thể chia sẻ mã của bạn trong câu hỏi này? những gì bạn đang cố gắng.
Chandru

đó là một mã phức tạp, nó có số N của dòng mã, khó khăn để chia sẻ
Sreehari Ballampalli

@Saurabh, thông thường nó không cần thiết phải tải lại một thành phần. Bạn có thể có một chức năng (ví dụ: gọi "khởi động lại") và gọi chức năng trong nút Làm mới của bạn. Nếu bạn cần đăng ký vào con đường thay đổi, hoặc một dịch vụ khác, sử dụng các chức năng ngOnInit phải thành phần -Website của bạn kéo dài OnInit-, không phải là nhà xây dựng
Eliseo

Đây là những gì tôi đã làm với Angular 9 stackoverflow.com/a/60909777/1072395
Wlada

Câu trả lời:


114

Sau một số nghiên cứu và sửa đổi mã của tôi như bên dưới, tập lệnh đã hoạt động với tôi. Tôi chỉ thêm điều kiện:

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

1
Tôi đang sử dụng cái này trong một dịch vụ tiêm. Tôi đã thay thế "your actualComponent"bằng một biến. Biến được đặt được đặt thành this.location.path()trước lệnh gọi tới navigateByUrl. Bằng cách đó, không cần phải chuyển bất kỳ tham số nào từ việc gọi thành phần hoặc sao chép / chuyển xung quanh các tuyến đường.
Tewr

4
bạn có thể vui lòng giải thích 'RefrshComponent' và 'Your realComponent' là gì không?
Reverie_ss

15
Hầu hết mọi người sẽ ổn '/'khi sử dụng where /RefrshComponentis, và đối với [Your actualComponent"]bạn chỉ cần chuyển url (và / hoặc params) mà bạn muốn tải lại chẳng hạn this.router.navigate(["/items"]). Hack này về cơ bản chuyển hướng đến URL trên cùng, và sau đó rất nhanh chóng quay lại URL dự định mà hầu hết người dùng không thể nhận thấy và dường như là cách hack thanh lịch nhất để đạt được điều này một cách đơn giản.
sofly

2
Tôi đồng ý rằng điều này chắc chắn sẽ hoạt động ... nhưng nó không thành công trong ứng dụng của tôi (Angular 6). Nếu tôi sử dụng '/'làm tuyến đường giả của mình, nó sẽ đi (qua redirectTo) đến nơi mà app-routing.module.ts của tôi chuyển hướng đến trên đường dẫn ''(chuỗi trống) và dừng lại, không tiếp tục đến tuyến đường hoàn thành trong navigate()cuộc gọi. Nếu tôi sử dụng một chuỗi không tồn tại (ví dụ /foo) làm tuyến đường giả của mình, nó sẽ đi (qua redirectTo) nơi app-routing.module.ts của tôi chuyển hướng cho **(mọi thứ khác) và lại dừng lại, không đi đến tuyến đường thực. Thật kỳ lạ, thanh URL KHÔNG thay đổi thành tuyến đường thực. Bất kỳ suy nghĩ về những gì là khác nhau ở đây?
Michael Sorens

1
điều này có thể gây ra một vòng lặp vô hạn chuyển hướng nếu không được sử dụng một cách cẩn thận
Tomas Katz

64

Sử dụng this.ngOnInit (); để tải lại cùng một thành phần thay vì tải lại toàn bộ trang !!

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

        this.ngOnInit();

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

5
Mặc dù điều này có thể trả lời câu hỏi của các tác giả, nhưng nó thiếu một số từ giải thích và / hoặc liên kết đến tài liệu. Các đoạn mã thô không hữu ích lắm nếu không có một số cụm từ xung quanh chúng. Bạn cũng có thể thấy cách viết một câu trả lời hay rất hữu ích. Vui lòng chỉnh sửa câu trả lời của bạn.
hellow

1
Đây là đầu vào tốt hơn câu trả lời đã chọn nhưng nó thiếu giải thích. Trong trường hợp cụ thể của tôi, tôi phải làm mới một thành phần con. Trong trường hợp đó, có một số cách nhưng được khuyến nghị là sử dụng một dịch vụ hoặc truyền phát một sự kiện từ cha mẹ đến con cái.
Claudio

5
Đồng ý, điều này chỉ hoạt động nếu bạn muốn làm mới thành phần từ bên trong thành phần - nếu bạn đang xử lý các thành phần con / bên ngoài this.ngOnInit () sẽ không hoạt động
astro8891

3
Mặc dù nó hoạt động cho thành phần, nó không đặt lại trình xác thực biểu mẫu.
Vicky Gonsalves

1
Hoạt động hoàn hảo, cảm ơn bạn. Và liên quan đến giải thích AFAIC, mã nói lên tất cả.
Marton Tatai

27

Thêm điều này vào mã vào phương thức khởi tạo của thành phần được yêu cầu đã làm việc cho tôi.

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

Đảm bảo unsubscribetừ mySubscription này trong ngOnDestroy().

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

Tham khảo chuỗi này để biết thêm chi tiết - https://github.com/angular/angular/issues/13831


15

May mắn thay, nếu bạn đang sử dụng Angular 5.1+, bạn không cần phải thực hiện hack nữa vì hỗ trợ gốc đã được thêm vào. Bạn chỉ cần đặt onSameUrlNavigation để 'tải lại' trong các tùy chọn RouterModule:

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

Bạn có thể tìm thêm thông tin tại đây: https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2


Bạn cũng có thể sử dụng router.onSameUrlNavigation = 'reload'thuộc tính của Router được chèn.
0zkr PM

4
Với tôi, sử dụng góc 6, điều này không có gì khác biệt, tức là thành phần không tải lại. Tuy nhiên, câu trả lời được chấp nhận hoạt động.
Tewr

4
Mặc dù không hoàn toàn rõ ràng trong tài liệu, nhưng onSameUrlNavigationnhằm mục đích gọi lại Guards / Resolvers và không tải lại các thành phần đã được định tuyến. Xem github.com/angular/angular/issues/21115 để biết thêm về điều này. Giải pháp này sẽ hoạt động với các ứng dụng phức tạp hơn lớn hơn bằng cách sử dụng Guards / Resolvers nhưng sẽ không thành công đối với các ví dụ đơn giản.
sofly

1
vâng, onSameUrlNavigation sẽ kích hoạt lại các sự kiện điều hướng, nhưng điều này không tải lại thành phần
Paul Story

6

cái này hơi lỗi và tôi không biết liệu điều này có giúp được bạn hay không nhưng bạn đã thử

this.ngOnInit();

nó là một chức năng vì vậy bất kỳ mã nào bạn có trong đó sẽ được gọi lại giống như làm mới.


3

chỉ cần làm điều này: (cho góc 9)

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

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

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

2
Vui lòng đọc bình luận của OPs, làm mới toàn bộ trang không phải là một lựa chọn đối với anh ấy, nó đánh bại mục đích đầu tiên của việc có góc cạnh
ihorbond

Câu hỏi chỉ yêu cầu tải lại thành phần chứ không phải toàn bộ trang.
Santosh

2

Điều này có thể đạt được thông qua một bản hack, Điều hướng đến một số thành phần mẫu và sau đó điều hướng đến thành phần mà bạn muốn tải lại.

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

SampleComponent có nghĩa là nó phải là một thành phần trống hoặc một thành phần khác trong dự án của tôi?
Sreehari Ballampalli

nó phải là một hình nộm, có thể trống
Sajeetharan

Được rồi, tôi sẽ thử cái này
Sreehari Ballampalli 14/1217

nếu tôi cung cấp đúng Tôi nhận được một thông báo lỗi: [ts] Loại 'true' không có tính chất tương đồng với kiểu 'NavigationExtras'
Sreehari Ballampalli

@SreehariBallampalli kiểm tra câu trả lời đã cập nhật, bạn cần chuyển một đối tượng {bỏ quaLocationChange: true}
Sajeetharan

2

Trong ứng dụng của tôi, tôi có thành phần và tất cả dữ liệu đến từ API mà tôi đang gọi trong hàm tạo của Thành phần. Có nút mà tôi đang cập nhật dữ liệu trang của mình. khi nhấp vào nút, tôi có lưu dữ liệu ở phần cuối và làm mới dữ liệu. Vì vậy, để tải lại / làm mới thành phần - theo yêu cầu của tôi - chỉ là làm mới dữ liệu. nếu đây cũng là yêu cầu của bạn thì hãy sử dụng cùng một đoạn mã được viết trong hàm tạo của thành phần.


2

Một cách khác không có tuyến đường rõ ràng:

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

tệp html

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

tập tin ts

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

-3

Cách khác để làm mới (cách khó) một trang ở góc 2 như thế này, nó trông giống như f5

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

constructor(private location: Location) {}

pageRefresh() {
   location.reload();
}

1
Anh ấy nói rằng tải lại toàn bộ trang là không phù hợp, điều này tải lại toàn bộ trang, không chỉ một / nhiều thành phần.
Milan Velebit

Tôi đã kết thúc bằng cách sử dụng này, ngoại trừ dịch vụ vị trí góc không có tải lại, vì vậy tôi đã sử dụng cửa sổ.
Paul Story
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.