2017-05-28 31 views
5

Xem xét cấu hình tuyến đường sau:Làm thế nào để làm mới dữ liệu giải quyết của một tuyến đường

const routes: Routes = [ 
    { 
    path: '', 
    component: AppComponent, 
    resolve: { 
     app: AppResolver 
    }, 
    children: [ 
     { 
     path: 'user/:uid', 
     resolve: { 
      user: UserResolver 
     }, 
     children: [ 
      { 
      path: '', 
      component: ViewUserComponent 
      }, 
      { 
      path: 'edit', 
      component: EditUserComponent 
      } 
     ] 
     } 
    ] 
    } 
]; 

Người dùng dữ liệu được lấy ra bởi UserResolver cho bất kỳ trẻ em của tuyến đường /user/:uid. Sử dụng dữ liệu này, bạn có thể xem hồ sơ người dùng bằng cách điều hướng đến /user/:uid và sau đó chỉnh sửa bằng cách điều hướng đến /user/:uid/edit. Sau khi chỉnh sửa thành công, người dùng sẽ được chuyển hướng đến hồ sơ được cập nhật của người dùng (/user/:uid).

Tuy nhiên, cả chế độ xem và trang chỉnh sửa đều là trẻ em của tuyến đường được giải quyết, trình phân giải không được kích hoạt khi điều hướng từ người này đến người khác.

Do đó, khi điều hướng trở lại từ thành phần chỉnh sửa sang thành phần chế độ xem, dữ liệu được hiển thị vẫn là cũ, không được cập nhật.

Có cách nào để vô hiệu hóa dữ liệu đã được giải quyết user để buộc trình phân giải tìm nạp lại từ máy chủ không? Hay có cách nào khác để đạt được kết quả như vậy?

Dữ liệu app không thay đổi, chúng tôi không phải tải lại dữ liệu đó.

+0

Sử dụng dịch vụ được chia sẻ thay vì thành phần chính để xử lý dữ liệu. –

+0

@HarryNinh Tôi có thể, nhưng nó có nghĩa là nhân đôi mã đăng ký với param tuyến và gọi dịch vụ trong mọi thành phần con trong khi tái triển khai một chiến lược bộ nhớ đệm trong dịch vụ được chia sẻ. Điều này dường như đánh bại mục đích của việc giải quyết tuyến đường. – vlaurin

+0

Rất nhiều và rất nhiều tìm kiếm về chủ đề này. Tốt nhất là tôi có thể nói cách duy nhất để xử lý việc này là đăng ký một sự kiện và tải lại dữ liệu theo cách thủ công. Lý tưởng nhất, bạn sẽ cấu trúc ứng dụng. để bạn có thể làm điều đó thông qua việc sử dụng lại mã, nhưng ngay cả đó cũng là một thách thức bởi vì việc tái sử dụng một Resolve không phải là tầm thường về tài khoản nhận trạng thái router. Tôi đã chọn để tạo ra một chức năng công cộng trong Resolve của tôi có thể được tái sử dụng và bỏ qua các chức năng giải quyết chính nó. Đây là một khu vực xác định nơi có thể cải thiện. Tôi đã thấy rất nhiều người gặp phải vấn đề này. –

Trả lời

3

Có một tham số bạn có thể sử dụng trong cấu hình tuyến đường được gọi là 'runGuardsAndResolvers' sẽ ảnh hưởng đến thời điểm trình giải quyết chạy. Trong trường hợp này, bạn sẽ muốn đặt nó thành 'luôn luôn'. Điều này có nghĩa là trình phân giải sẽ chạy bất cứ lúc nào các tuyến con của tuyến đường đó thay đổi. Xem the route documentation để biết thêm thông tin.

5

Tôi đã thử nghiệm giải pháp 'runGuardsAndResolvers', nó hoạt động cho trường hợp sử dụng của tôi, trình phân giải được gọi ở mỗi thay đổi của trang phụ.

Chỉ thêm tùy chọn này là một phần của tuyến đường mà bạn muốn hoạt động theo cách này.

export const ROUTES: any = [ 
    { 
    path: 'project/:name', 
    runGuardsAndResolvers: "always", 
    component: ProjectComponent, 
    resolve: { project: ProjectResolver }, 
    children: [ 
     ... 
Các vấn đề liên quan