2014-01-18 90 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', {}); 
    } 
}