2017-02-15 21 views
0

這裏的另一路由方案:角 - 比顯示的URL一個

  • 我在/group/
  • 我點擊一組,從而試圖去/group/:id
  • 我AuthGuard被稱爲與激活的路由,解決並檢查CanActivate
  • CanActivate檢測到用戶不應該去的路線。
    用戶可能在檢索組列表之間失去了權限,並且他試圖訪問特定的權限。

當前的行爲是,如果我返回false,則url永遠不會被激活。如果我返回true,則url將被激活,但是,整個組件樹將被渲染,並且所有的router-outlet都需要物理存在。

我想這樣做:

URL應被激活(即/group/:id在URL和歷史),但顯示應與其他途徑(如/404/login)的頁面。 我堅持這樣一個事實,即地址欄中的網址必須保持原來的/group/:id

我曾經想過兩種可能性:

  • 具有本地404組件,和隱藏路由器的出口,如果需要顯示404。
    但問題是404組件應該是全局的,從根到嵌套的模板不應該顯示。它不僅僅是最後一部分是無效的,而是整個路線。
  • 因此,我可以有一個服務存儲關於是否應該顯示404的信息,然後是隱藏router-outlet的頂層組件,並在需要時顯示404。

儘管這些解決方案對我來說似乎並不完美。他們只是解決問題,而不解決問題。
特別是,router-outlet不能是*ngIf ed,這意味着即使我顯示404或登錄頁面,DOM將被填充激活的路由的整個網站組件,但沒有任何數據,並且即使用戶不應該看到它。對我來說這似乎很醜陋。 我並不是想解決路由器插座應該存在以解決路由這一事實,我只是想讓角色假裝URL上的路由,並激活另一個路由。

使用Angular實現這種行爲的正確方法是什麼?

感謝

回答

0

採用了最新的答案,我挖成Router類和想通我們可以爲了不更新URL傳遞{skipLocationChange: true}Router.navigate

所以,當路由被激活時,在組件的構造函數中,我只需要檢查路由參數是否解析成有效的對象,如果不是這樣的話,我默默地導航到404:

@Injectable() 
export class GroupResolve implements Resolve<Group> { 
    constructor() {} 

    resolve(route: ActivatedRouteSnapshot) { 
     return api.getGroup(route.params['id']); 
     /* Returns null if user can't access such a group */ 
    } 
} 

@Component({ 
    templateUrl: 'group.component.html', 
    providers: [ GroupResolve ] 
}) 
export class GroupComponent { 
    constructor(public route: ActivatedRoute, private router: Router) { 
     if(route.snapshot.data['group'] == null) { 
      /* The user can't access the given group page, silently navigate to a global 404 route */ 
      this.router.navigate(["404"], {skipLocationChange: true}); 
     } 
    }; 
} 
0

我認爲這是做到這一點的角2路:

一)頁面沒有找到有備用路徑 「**」

{ 
    path: '**', 
    component: NotFoundComponent 
} 

二)保護頁面有onActivate機制

{ 
    path: 'private', 
    component: PrivateComponent, 
    canActivate: [Guard] 
} 

我不認爲你必須隱藏或ngIf-fy路由器出口。路由器插座始終存在,是應用程序的關鍵部分。

Plunkr:

  • 圍棋在窗口模式下能夠在檢查路線,在地址欄中
  • 點擊「導航到不存在的頁面」:在地址欄中顯示「/不存在」但實際上你會看到404組件
  • 單擊「導航到私有」:Guard將返回false,這意味着導航被取消。由於在路由器上訂閱了事件Observable,用戶將被重定向到登錄頁面。 「/ login」是您在地址欄中看到的內容。

https://plnkr.co/edit/FSklRhhQV0cpLFP53I13

+0

那麼,這並沒有真正回答我的問題...... 一)回退的路線,我已經在使用它,但我想顯示的有效途徑,在帕拉姆後備內容路由無效,即被我的認證守衛拒絕。 b)這個解決方案可能是最漂亮的一個,但作爲實際改變url的缺點。這正是我想要避免的。 – SRLKilling