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

Javascript 如何在激活任何视图之前激活模态视图,javascript,durandal-2.0,Javascript,Durandal 2.0,我正在挂接canActivate回调以加载登录模型/视图。我的欢迎视图显示激活回调中的登录对话框,该对话框工作正常。我想通过登录阻止所有视图的激活,而不是在视图激活后简单地调用它。似乎我的登录模型/视图不会加载,除非至少加载了一个其他视图。加载welcome后,在尝试导航到连接到canActivate的其他视图时,可以使模型显示良好 以下是我的欢迎模式中的外观: self.activate = function () { if( session.token() == null){

我正在挂接canActivate回调以加载登录模型/视图。我的欢迎视图显示激活回调中的登录对话框,该对话框工作正常。我想通过登录阻止所有视图的激活,而不是在视图激活后简单地调用它。似乎我的登录模型/视图不会加载,除非至少加载了一个其他视图。加载welcome后,在尝试导航到连接到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从登录对话框返回一个承诺,并且仅在成功登录后对话框关闭后才激活。我可以在激活任何视图之前显示该对话框吗?

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

示例CanActivate(类型脚本):

应用程序requireLogin示例逻辑:

应用程序goLogin示例逻辑:

应用程序导航示例:

其中,m_路由器是路由器模块:

导入m_路由器=需要(“插件/路由器”)


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

如果将canActivate代码移动到激活功能中会怎么样?
public canActivate(parms?: any): any {
    return this.doRequireLogin ? Q.resolve(this.app.requireLogin(this.modelId)) : true;
}
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);
}
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);
}