如何在激活任何视图之前激活模态视图

时间:2015-09-04 16:13:50

标签: javascript durandal-2.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从登录对话框返回一个promise,只有在成功登录后对话框关闭后才会激活。我可以在激活任何视图之前显示对话框吗?

1 个答案:

答案 0 :(得分:0)

我建议在未登录时,在每个viewmodel canActivate(在需要身份验证的视图上)上使用login page-viewmodel和route-redirect。 发生这种情况时,您将当前路由保存到某个全局应用程序级别变量。 然后,一旦登录,您将重定向回到您首先访问的视图。

示例CanActivate(Typescript):

bounds

app requireLogin示例逻辑:

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

app goLogin示例逻辑:

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;
    }
}

应用导航示例:

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

m_router是路由器模块的地方:

  

import m_router = require('plugins / router');

最后,在登录视图模型中进行登录后,您可以使用app.navigateTo返回原始路线。