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