从Angular Dart控制器访问路由器

时间:2014-01-18 20:58:24

标签: dart angular-dart

我有一个基本的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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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 );

答案 2 :(得分:1)

你应该总是得到Router的同一个实例 - 只能有一个,否则会发生不可预知的事情。

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

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

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