簡體   English   中英

Angular2將數據從CanActivate保護傳遞到Resolve解析器?

[英]Angular2 pass data from CanActivate guard to Resolve resolver?

我有一種情況,我一直在使用Resolve在導航到組件之前通過HTTP調用從遠程源預加載一些數據。 現在我需要實現一些保護邏輯,這需要根據某些條件預先加載數據以驗證當前用戶的某些字段。

我想避免向CanActivate后衛中的后端發出完全相同的請求,然后立即在Resolve發出相同的請求。

有沒有什么方法可以從CanActivate或路由配置中訪問路由數據來臨時覆蓋解析器,只是設置數據對象的值,因為我已經得到了我要請求的內容?

我試着逃避一些簡單的事情

route.data['myData'] = value;

但這是一個錯誤,因為“對象不可擴展”。

我也試過類似的東西:

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

這沒有產生任何錯誤,但是數據沒有存活到Resolve.resolve()方法的route.data元素中。

我想避免像定制或hacky這樣的東西,就像臨時將對象存儲在服務上一樣,就像某種緩存一樣。 是否有任何標准機制在內部路由器元素之間傳輸數據以支持高級預取和數據所有權檢查等內容?

編輯如果將Router注入Resolve類的構造函數,並且以相同的方式訪問它,則routerState可以正常工作。 但這需要在之后清除,否則它會在導航呼叫之間保持不變。

ActivatedRouteSnapshot的屬性data是不可變的,這就是您收到錯誤的原因:

對象不可擴展

但你可以像這樣替換整個對象:

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

並在您的解析器中訪問它

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

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM