我正在挂钩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,只有在成功登录后对话框关闭后才会激活。我可以在激活任何视图之前显示对话框吗?
答案 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返回原始路线。