天天看點

SAP Spartacus 404 Not found頁面的顯示機制 - canActivateNotFoundPage

這個方法位于類CmsPageGuardService内。

當我們請求一個實際并不存在的page時,

因為1這個path對應的route configuration裡的protected字段為undefined,是以不算是protected route,是以canActivate傳回true.

進入this.routingService.getNextPageContext方法。

該方法從ngrx store裡用SELECT取出Observable:

SAP Spartacus 404 Not found頁面的顯示機制 - canActivateNotFoundPage

此時取出的page context已經不是homepage,而是1了:

SAP Spartacus 404 Not found頁面的顯示機制 - canActivateNotFoundPage

試圖取這個pageLabelOrId為1的page,當然取不到資料:

SAP Spartacus 404 Not found頁面的顯示機制 - canActivateNotFoundPage

是以進入this.service.canActivateNotFoundPage:

SAP Spartacus 404 Not found頁面的顯示機制 - canActivateNotFoundPage

而我在浏覽器位址欄裡輸入1之後,page context何時改變的呢?

答案是在ngrx-router.store.js裡,調用537行我們自己實作的serializer, 将包含了electronics-spa/en/USD/1的RouterStateSnapshot,序列化成一個新的nextRouterState:

SAP Spartacus 404 Not found頁面的顯示機制 - canActivateNotFoundPage

新的page context 對象在此處生成:

SAP Spartacus 404 Not found頁面的顯示機制 - canActivateNotFoundPage

然後通過serializer傳回給調用者,dispatch給ngrx store:

SAP Spartacus 404 Not found頁面的顯示機制 - canActivateNotFoundPage

538行執行完畢之後,再進入我們的router.reducer.ts:

SAP Spartacus 404 Not found頁面的顯示機制 - canActivateNotFoundPage

繼續閱讀