2017-05-18 25 views
11

Tôi có một tình huống mà tôi đã sử dụng một Giải quyết để tải trước một số dữ liệu từ một nguồn từ xa thông qua một cuộc gọi HTTP trước khi điều hướng đến một thành phần. Bây giờ tôi cần phải thực hiện một số logic bảo vệ mà đòi hỏi rằng, tùy thuộc vào một số điều kiện, dữ liệu đó được nạp sẵn để xác minh một số lĩnh vực trên nó chống lại người dùng hiện tại.Angular2 truyền dữ liệu từ CanActivate guard đến Resolve resolver?

Tôi muốn tránh yêu cầu chính xác cùng với chương trình phụ trợ trong bảo vệ CanActivate và sau đó ngay sau đó trong Resolve.

Có cách nào tôi có thể truy cập dữ liệu tuyến từ bên trong CanActivate hoặc cấu hình tuyến đường để tạm thời ghi đè trình phân giải và chỉ đặt giá trị trên đối tượng dữ liệu kể từ khi tôi nhận được yêu cầu?

Tôi cố gắng chạy xa bay với một cái gì đó đơn giản như

route.data['myData'] = value; 

Nhưng đây là một lỗi vì "đối tượng không phải là mở rộng".

Tôi cũng đã cố gắng một cái gì đó như:

this.router.routerState.root.data['myData'] = value; 

nào không tạo ra bất kỳ lỗi nào, tuy nhiên các dữ liệu đã không còn tồn tại vào các yếu tố route.data của phương pháp Resolve.resolve().

Tôi muốn tránh điều gì đó quá tùy chỉnh hoặc bị hack như tạm thời lưu trữ đối tượng trên Dịch vụ như một số loại bộ nhớ cache. Có cơ chế chuẩn nào để chuyển dữ liệu giữa các phần tử bộ định tuyến nội bộ để hỗ trợ tìm nạp trước tiên tiến và các nội dung như kiểm tra quyền sở hữu dữ liệu không?

EDIT RouterState không hoạt động nếu bạn đưa Bộ định tuyến vào hàm tạo của lớp Resolve và truy cập theo cùng một cách. Nhưng điều này cần phải được xóa sau đó nếu không nó vẫn tồn tại giữa các cuộc gọi điều hướng.

Trả lời

0

Thuộc tính data của một ActivatedRouteSnapshot là không thay đổi, đây là lý do tại sao bạn nhận được thông báo lỗi:

object is not extensible

Nhưng bạn có thể thay thế toàn bộ đối tượng, như thế:

@Injectable() 
export class MyGuard implements CanActivate { 
    canActivate(
    next: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { 

    // Use the spread operator to keep the previously resolved data 
    next.data = {...next.data, guardedData: 'guarded'}; 
    return true; 
    } 
} 

Và truy cập trong bảng phân giải của bạn

@Injectable() 
export class FooResolver implements Resolve<any> { 

    resolve(
    route: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot 
): Observable<any>|Promise<any>|any { 
    return route.data.guardedData; 
    } 

} 
Các vấn đề liên quan