在加载控制器之前验证路由前提条件

w.b*_*ian 8 dart angular-dart

我在Angular中编写单页应用程序,特别是angular.dart,但我假设这个问题仍然适用于AngularJS.

例如,以下路线:

/ login - 预计没有人登录.如果某人经过身份验证但未注册,则重定向到"注册"路由,如果已注册,则重定向到"主页"路由.

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

/ home - 期待经过身份验证和注册的用户.如果未经过身份验证,则重定向到"登录"路由,如果未注册,则重定向到"注册"路由.

我已经完成了相当多的搜索,但是在加载与特定路径关联的控制器之前无法找到内置或惯用的方法来确保满足某些先决条件,并且在不满足这些前提条件时适当地重定向.

任何帮助将不胜感激!

pav*_*lgj 4

Angular.Dart 和 Angular.JS 路由框架非常/根本不同。Angular.Dart 使用第三方路由框架(https://github.com/dart-lang/route/tree/experimental_hierarchical),并且仅实现 Angular 特定功能,例如ng-view通过ViewFactory.

所以你的问题确实属于route_hierarchical包领域。目前,您可以否决用户尝试离开路线,但我猜您希望能够根据用户是否登录来否决用户输入路线。不幸的是,这尚未得到支持,但已计划实施。

同时您可以尝试创建一个自定义 viewFactory 包装器。

class RecipesRouteInitializer implements RouteInitializer {
   void init(Router router, ViewFactory view) {
     router
       ..addRoute(
          name: 'login',
          path: '/login',
          enter: authView(router, view('login.html'), NOT_AUTH))
       ..addRoute(
          name: 'register',
          path: '/register',
          enter: authView(router, view('register.html'), AUTH_NO_REG))
       ..addRoute(
          name: 'home',
          path: '/home',
          enter: authView(router, view('home.html'), AUTH_AND_REG));
   }

   authView(Router router, ngView, mode) {
     return (RouteEvent e) {
       if (mode == AUTH_AND_REG) {
         if (!authService.isAuth) {
           router.go('login', {});
           return;
         }
         if (!authService.isReg) {
           router.go('register', {});
           return;
         }
       } else if (mode == AUTH_NO_REG) {
         if (!authService.isAuth) {
           router.go('login', {});
           return;
         }
         if (authService.isReg) {
           router.go('home', {});
           return;
         }
       } else if (mode == NOT_AUTH) {
         if (authService.isAuth) {
           router.go('register', {});
           return;
         }
       }
       ngView(e);
     };
   }
Run Code Online (Sandbox Code Playgroud)

}

免责声明:这只是一个想法......可能完全行不通。