2014-02-18 4 views
7

Ich schalte meine App auf das neue Routing DSL um. Insbesondere möchte ich mit preEnter, so etwas zu tun:Wie man Dienste in RouteInitializerFn injiziert (neues Routing DSL)

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') 
    }); 
} 

Dies würde im Modul so konfiguriert werden, wie folgt:

value(RouteInitializerFn, routes);

Falls Sie es verpasst, ich bin Referenzierung eine injizierbare authService innerhalb der RouteInitializerFn. Dies ist nicht möglich, da RouteInitializerFn eine Funktion und keine Klasse ist, also kann nichts in sie eingefügt werden. Wenn ich die routes Funktion innerhalb einer Klasse gekapselt habe, bin ich nicht sicher, wie ich RouteInitializerFn konfigurieren könnte, also bin ich in einer Zwickmühle.

Antwort

8

Ich fand eine ziemlich coole Lösung für dieses Problem. Wenn Sie eine call-Methode für eine Klasse definieren, die einen typedef erfüllt, können Sie sie als Implementierung von typedef konfigurieren. Sehr cool. Hier ist meine Lösung:

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' 
    ) 
    }); 
    } 
} 

und das ist, wie es in dem Modul konfiguriert ist:

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

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

Diese saubere Lösung scheint mit Dart 1,5 gebrochen zu haben. Ich bekomme jetzt "Illegale Argument (e): Kein Typ Factory für Routen zur Verfügung gestellt! (Auflösung RouteInitializerFn)" – TaisPH

+0

Das ist seltsam. Ich laufe 1.5.1 und es funktioniert immer noch für mich. –

+0

Ich bin auch auf 1.5.1. Kein Code wurde geändert und Abhängigkeiten sind genau die Version, die sie vor dem Aktualisieren von Dart waren. – TaisPH