2015-09-04 89 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回到原来的路线。