2015-09-04 44 views
0

我掛鉤了canActivate回調來加載登錄模型/視圖。我的歡迎視圖顯示了激活回調中的登錄對話框,它工作得很好。我想阻止激活所有視圖與登錄,而不是簡單地在視圖激活後調用它。看起來像我的登錄模型/視圖不會加載,除非至少有一個其他視圖加載。一旦我加載歡迎,我可以讓模型在嘗試導航到其它視圖時被顯示得很好,這些視圖被掛鉤到canActivate中。如何在任何視圖激活之前激活模態視圖

這裏是什麼樣子,我歡迎型號:

self.activate = function() { 
     if(session.token() == null){ 
      app.showDialog(new Login()) 
     } 
    } 

以及它看起來像我的其他車型:

self.canActivate = function() { 
     if(session.token() == null){ 
     return app.showDialog(new Login()).then(function(){ 
      return true; 
     })  
     } 
     else{ 
     return true; 
     } 
    } 

的canActivate從登錄對話框返回的承諾,只在成功登錄後對話框關閉後激活。在激活任何視圖之前可以顯示對話框嗎?

+0

如果將canActivate代碼移動到activate函數中,該怎麼辦? – Svakinn

回答

0

我會建議使用登錄頁面viewmodel和路線重定向到它在每個viewmodel canActivate(在需要身份驗證的視圖上)當沒有登錄 當發生這種情況時,你保存當前路由到一些global-應用程序級變量。 然後,一旦登錄,您將重定向回您首先訪問的視圖。

例CanActivate(打字稿):

public canActivate(parms?: any): any { 
    return this.doRequireLogin ? Q.resolve(this.app.requireLogin(this.modelId)) : true; 
} 

該應用requireLogin示例邏輯:

public requireLogin(moduleId: string): boolean { 
    this.pageModuleId = moduleId; 
    if (this.isLogedIn()) 
     return true; 
    else { 
     if (this.loginPageIdFrom == '' || this.loginPageIdFrom == this.cfg.startModule) 
      this.loginPageIdFrom = moduleId; 
     this.goLogIn(); 
     return false; 
    } 
} 

該應用goLogin示例邏輯:

public goLogIn(): void { 
    this.mainMenu().selectById(this.cfg.startModule); 
    this.navigateTo(this.cfg.loginPage); 
} 

該應用程序導航例如:

public navigateTo(routeId: string): boolean { 
    var rr: string = routeId; 
    if (rr == 'home') //Handle the fact that module home is routeid as '' (as Durandal default route) 
     rr = ''; 
    return m_router.navigate(rr); 
} 

凡m_router是路由器模塊:

進口m_router =要求( '插件/路由器');

最後在登錄後發生登錄viewmodel您使用app.navigateTo回到原來的路線。