2017-04-19 36 views
1

這個問題是關於一個角落案件,但我仍然想正確處理它,而不會破壞用戶界面或使其看起來破碎。 最小值應該是404頁。如何處理用戶的路由操作

讓我們假設我有這樣的路線:

/projects/:projectId/administration/members/:memberId 

現在,用戶操作與不存在的MEMBERID的路線。

該代碼知道memberId確實存在NOT,因爲當數據庫請求完成時,我在成員列表中搜索該memberId。

如果MEMBERID將存在我要強調在該列表中成員和另一router.navigate()方法被調用到:

/projects/:projectId/administration/members/:memberId/tasks 

但隨着MEMBERID不存在,該航線被激活,已經它看起來很愚蠢到再次導航到我的404組件...

我不知道在早期體育場 - 在路線激活之前 - 會員ID存在。

那麼你將如何處理這個問題?

選項1:導航很晚404頁

選項2:保留成員名單,因爲它是,因爲你不能突出MEMBERID的路線。

也許你有更多的選擇或更好的建議?

快樂路徑 - 當用戶使用用戶界面導航

  1. 用戶是根路徑上/projects
  2. 用戶選擇一個項目,然後單擊打開
  3. 用戶被導航到孩子航線:/projects/:projectId/administration/members
  4. 會員列表顯示
  5. 用戶通過(點擊)選擇一個成員,我MBER高亮顯示和手動路線導航做是爲了另一個孩子航線:/projects/:projectId/administration/members/:memberId/tasks

錯誤路徑 - 當使用者操作的URL通過UI

  1. 用戶的路徑上瀏覽: /projects/:projectId/administration/members/:memberId/tasks 和操作memberId像50000而不是現有的。沒有任何任務被返回。但是......當用戶開始爲一個不存在的memberId創建一個新任務並且保存到服務器時,當然由於ForeignKey是無效的,所以它會崩潰。

創建解析器

路線:/projects/:projectId/administration/members太早,因爲不存在MEMBERID

路線:/projects/:projectId/administration/members/:memberId/tasks

太晚的任務是成員列表的子路由/視圖,這意味着我的任務組件會必須與父成員組件進行通信以同步/檢查成員列表中的memberId。這太可怕了......

回答

0

出於同樣的原因Resolve guard is present to Fetch data before navigating.

在下面的例子中,如果找不到危機用戶發送到列表。

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<Crisis> { 
    let id = route.params['id']; 
    return this.cs.getCrisis(id).then(crisis => { 
     if (crisis) { 
     return crisis; 
     } else { 

     // id not found 
     this.router.navigate(['/crisis-center']); 

     return null; 
     } 
    }); 
    } 

希望這有助於!

+0

我已經做了一個類實現Resolve切換主菜單鏈接/屏幕。 AFAIR我已經閱讀過某些地方推薦不使用分辨率的子子屏幕。我忘了那個鏈接...並且考慮我沒有額外的細節/ id頁面。我的成員列表和活動成員位於相同的組件和相同的路由中。我不得不考慮它,也許重新排列一下路線,給我一些時間... – Pascal

+0

當成員和活動成員(id)在同一條路線上時,沒有導航回到像上面描述的「危機列表」我的情況與那些不支持真實世界的應用程序的mvc不同:-)在解析器中調用MemberExistsById調用服務器將是無稽之談。 – Pascal

+0

並且......成員的任務在下面的路由器插座中顯示在同一頁面上。 JFYI。當沒有成員因爲沒有被創建而存在時,它仍然應該去成員站點;-) – Pascal