我正在将我的应用切换到新的路由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
,所以我有点陷入困境。
答案 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);