2014-01-18 48 views
1

我有一个基本的Angular Dart程序,当前允许登录并在登录时显示基本仪表板。我想要做的是在成功登录后重定向到仪表板路径。我不知道如何从登录控制器访问路由器对象,尝试使用DI将Router加载到控制器工作,但给我一个新的Router对象而不是以前初始化的对象(如预期的那样)。从角度飞镖控制器访问路由器

main.dart

import 'package:angular/angular.dart'; 
import 'dart:convert' show JSON; 
import 'dart:html'; 

class TTRouter implements RouteInitializer { 

    Cookies _cookies; 

    TTRouter(this._cookies); 

    init(Router router, ViewFactory view) { 
    router.root 
     ..addRoute(
      name: 'login', 
      path: '/login', 
      enter: view('login.partial.html')) 
     ..addRoute(
      name: 'home', 
      path: '/dashboard', 
      enter: view('dashboard.partial.html')); 
    } 

} 

@NgController(
    selector: '[login-controller]', 
    publishAs: 'ctrl') 
class LoginController { 
    Http _http; 
    Scope _scope; 

    LoginController(this._scope, this._http); 

    login() { 
    // Login API request ommitted 
    // TODO: insert redirect to 'home' route here 
    } 
} 


class TTModule extends Module { 
    TTModule() { 
    type(RouteInitializer, implementedBy: TTRouter); 
    type(LoginController); 

    factory(NgRoutingUsePushState, 
     (_) => new NgRoutingUsePushState.value(false)); 
    } 
} 

main() => ngBootstrap(module: new TTModule()); 

login()使用ng-submit="ctrl.login()从登录局部视图调用。

如果我以错误的方式处理这个问题,我将不胜感激对代码结构的任何评论。我对Dart和Angular都是新手(阅读/观看的教程,但这是我自己构建的第一个应用程序)。

回答

3

如果您将路由器作为value添加到模块而不是type,则每次都会获得相同的实例。

TTModule() { 
    value(RouteInitializer, new TTRouter()); 
} 
+0

谢谢。你介意扩展我如何从控制器访问这个值吗? – Ollie

+1

没有区别。区别在于你如何通知DI如何处理这种类型。而不是一个新的实例,您将始终收到提供给'value(...)'方法的那个实例。 –

+0

我明白了,我犯了一个错误,现在我已经开始工作了。非常感谢! – Ollie

1

尝试使用NgRoutingHelper。

class LoginController { 
    Http _http; 
    Scope _scope; 

    NgRoutingHelper locationService; 
    LoginController(this._scope, this._http, NgRoutingHelper this.locationService); 

    login() { 
    // Login API request ommitted 
    // TODO: insert redirect to 'home' route here 
    locationService.router.go('home', {}); 
    } 
} 

不要忘了你的模块中添加服务

type(NgRoutingHelper); 
+1

'NgRoutingHelper'是一个内部帮助类。避免使用它,尤其是修改它的模块绑定。 – pavelgj

1

你应该始终得到Router相同的实例 - 只能有一个,否则不可预知的事情将开始发生。

class LoginController { 
    Http _http; 
    Scope _scope; 
    Router _router; 

    LoginController(this._scope, this._http, this._router); 

    login() { 
    _router.go('home', {}); 
    } 
}