如何将服务注入RouteInitializerFn(新的路由DSL)

时间:2014-02-18 04:13:52

标签: dart angular-dart

我正在将我的应用切换到新的路由DSL。具体来说,我希望使用preEnter执行类似的操作:

final RouteInitializerFn routes =(Router router, ViewFactory views) {
  views.configure({
   'chat': ngRoute(
     path: '/chat',
     // authService.requireState returns a Future<bool>, and may invoke an HttpRequest
     preEnter: (RoutePreEnterEvent e) => e.allowEnter(authService.requireState(LOGGED_IN)),
     view: 'views/chat.html'),

   'login': ngRoute(
     path: '',
     defaultRoute: true,
     view: 'views/login.html')
  });
}

这将在模块中配置如下:

value(RouteInitializerFn, routes);

如果您错过了,我在authService内引用了注射RouteInitializerFn。这是不可能的,因为RouteInitializerFn是一个函数而不是一个类,所以不能注入任何东西。如果我将routes函数封装在一个类中,我不确定如何配置RouteInitializerFn,所以我有点陷入困境。

1 个答案:

答案 0 :(得分:8)

我找到了一个非常酷的解决方案。事实证明,如果在满足typedef的类上定义call方法,则可以将其配置为typedef的实现。 非常酷。这是我的解决方案:

class Routes
{
  final UserService _userService;

  Routes(this._userService);

  void call(Router router, ViewFactory views) 
  {
    views.configure({
      'chat': ngRoute(
          path: '/chat',
          preEnter: (RoutePreEnterEvent e) => e.allowEnter(this._userService.requireUserState(UserService.LOGGED_IN)),
          view: 'views/chat.html'
      ),

      'login': ngRoute(
          path: '',
          defaultRoute: true,
          view: 'views/login.html'
      )
    });
  }
}

这就是它在模块中的配置方式:

// old syntax
type(RouteInitializerFn, implementedBy: Routes);

// new syntax
bind(RouteInitializerFn, toImplementation: Routes);