Dart 在加载控制器之前验证路由先决条件

Dart 在加载控制器之前验证路由先决条件,dart,angular-dart,Dart,Angular Dart,我正在用AngularJS编写一个单页应用程序,但我假设这个问题仍然适用于AngularJS 以以下路线为例: /login- 希望没有人登录。如果某人经过身份验证但未注册,则重定向到“注册”路由;如果某人已注册,则重定向到“主”路由 /register- 需要尚未完成注册过程的经过身份验证的用户。如果未通过身份验证,则重定向到登录。如果已通过身份验证,则重定向到主页 /home- 需要经过身份验证和注册的用户。如果未经验证,则重定向到“登录”路由;如果未注册,则重定向到“注册”路由 我已经做了

我正在用AngularJS编写一个单页应用程序,但我假设这个问题仍然适用于AngularJS

以以下路线为例:

/login- 希望没有人登录。如果某人经过身份验证但未注册,则重定向到“注册”路由;如果某人已注册,则重定向到“主”路由

/register- 需要尚未完成注册过程的经过身份验证的用户。如果未通过身份验证,则重定向到登录。如果已通过身份验证,则重定向到主页

/home- 需要经过身份验证和注册的用户。如果未经验证,则重定向到“登录”路由;如果未注册,则重定向到“注册”路由

我已经做了很多搜索,但找不到一种内置的或惯用的方法来检查,以确保在加载与特定路由相关联的控制器之前满足某些先决条件,并在不满足这些先决条件时适当重定向

任何帮助都将不胜感激

注意:这仅适用于AngularJS,保留此选项以备使用JS的人需要

查看中的
resolve
属性。您可以返回一个承诺,该承诺将决定是否应接受路线更改

从文档中:

如果这些依赖项中的任何一个是承诺,路由器将在控制器实例化之前等待它们全部被解析或一个被拒绝。如果成功解析所有承诺,则注入已解析承诺的值并触发$routeChangeSuccess事件。如果任何承诺被拒绝,将触发$routeChangeError事件


还有一个关于它的视频,egghead.io上的路由生命周期

Angular.Dart和Angular.JS路由框架有很大的不同。Angular.Dart使用第三方路由框架(),只实现特定于角度的功能,如
ng view
,以及通过
ViewFactory
将路由绑定到模板的方法

因此,您的问题实际上属于
route\u分层的
package域。目前,您可以否决用户尝试离开某个路由的行为,但我猜您希望否决用户进入某个路由的功能是什么,这取决于用户是否登录。不幸的是,这还没有得到支持,但已经计划好了

在此期间,您可以尝试创建自定义viewFactory包装器

类RecipesRouteInitializer实现RouteInitializer{
void init(路由器,视图工厂视图){
路由器
…addRoute(
名称:'登录',
路径:'/login',
输入:authView(路由器,视图('login.html'),而不是AUTH))
…addRoute(
名称:'注册',
路径:“/寄存器”,
输入:authView(路由器,视图('register.html'),AUTH\u NO\u REG))
…addRoute(
姓名:'家',
路径:'/home',
输入:authView(路由器、视图('home.html')、AUTH_和_REG);
}
authView(路由器、ngView、模式){
返回(RouteEvent e){
if(mode==AUTH_和_REG){
如果(!authService.isAuth){
go('login',{});
返回;
}
if(!authService.isReg){
go('register',{});
返回;
}
}else if(模式==AUTH\U NO\U REG){
如果(!authService.isAuth){
go('login',{});
返回;
}
if(authService.isReg){
router.go('home',{});
返回;
}
}else if(mode==NOT_AUTH){
if(authService.isAuth){
go('register',{});
返回;
}
}
ngView(e);
};
}
}


DISCLAMER:这只是一个想法。。。可能完全不起作用。

好吧,我在Dart中做了一件事,它接近于以前的一个解决方案,但实际上不起作用。主要的一点是,在
RouteEventHandler
中,您需要调用视图的
RouteEventHandler

.addRoute(
名称:“userAdd”,
路径:'/userAdd',
输入:checkAuthentication(路由器、视图、'view/addUser.html'))
…addRoute(
名称:'登录',
路径:'/login',
输入:view('view/login.html');
}
RouteEventHandler检查身份验证(路由器路由器、视图工厂视图、字符串位置){
返回(RouteEvent e){
如果(_authenticationService.isAuthenticated()){
视图(位置)(e);
}否则{
go(“login”,{});
}
};
}

我知道以下解决方案不适用于Angular.Dart,但仍然值得一提的是ui路由器解决方案:


很遗憾,这不适用于Angular.dart。谢谢您的回复!就您提出的解决方案而言,如果(例如)我必须向服务器发出请求以验证缓存的访问令牌是否有效--根据异步行为是否会破坏此解决方案?我相信应该可以异步调用
ngView(e)
。因此,您提出的解决方案确实有效,但如果异步调用ngView(),则不起作用。不会抛出错误,日志记录也不会显示任何问题,视图永远不会显示。
app.config(function($stateProvider) {
  $stateProvider.state('privatePage', {
  data: {
    rule: function(user) {
    // ...
  }
});
});
app.run(function($rootScope, $state, $currentUser) {
$rootScope.$on('$stateChangeStart', function(e, to) {
if (!angular.isFunction(to.data.rule)) return;
var result = to.data.rule($currentUser);

if (result && result.to) {
  e.preventDefault();
  // Optionally set option.notify to false if you don't want 
  // to retrigger another $stateChangeStart event
  $state.go(result.to, result.params, {notify: false});
}
});
});