角度2更新应用程序组件从路由器出口组件

Dan*_*esz 5 angular2-routing angular2-services angular

我正在使用angular 2 rc1和新路由器@ angular/router

在应用程序组件中,我有一个导航部分和路由器插座

<nav>   
    <a *ngIf="auth?.userName == null" [routerLink]="['/login']">Login</a>
    <a *ngIf="auth?.userName != null" (click)="logout()">Logout</a>
    {{auth?.userName}}
</nav> 
<router-outlet></router-outlet>
Run Code Online (Sandbox Code Playgroud)

我将一个loginService注入app组件并订阅ngOnInit中的一个事件

ngOnInit() {
    this.loginService.loginSuccess.subscribe(this.loginSuccess);

} 
ngOnDestroy() {
    this.loginService.loginSuccess.unsubscribe();
}
private loginSuccess(res: IAuthResponse) {
    this.auth = res;
}  
Run Code Online (Sandbox Code Playgroud)

当我导航到我的'/ login'路由页面/组件时,我的loginService是inject,loginService定义了一个事件

@Output() loginSuccess = new EventEmitter<IAuthResponse>();
Run Code Online (Sandbox Code Playgroud)

在成功登录我的服务后,登录服务会引发该事件

this.loginSuccess.next(response);
Run Code Online (Sandbox Code Playgroud)

我能够在订阅的loginSucess上的app组件中设置断点,并且数据被传递,但是'this'是未定义的.

private loginSuccess(res: IAuthResponse) {
    this.auth = res;  //this is undefind
} 
Run Code Online (Sandbox Code Playgroud)

如何从在路由器插座中托管的组件中使用的服务触发的事件更新应用程序组件

Gün*_*uer 5

不确定你的意思是"并传递数据".

@Output() loginSuccess = new EventEmitter<IAuthResponse>();
Run Code Online (Sandbox Code Playgroud)

在路由器(LoginComponent)添加的组件中没有做任何事情. @Input()并且@Output()不支持路由组件.

只需注入LoginService路由组件并使用登录组件中的observable发出事件.

@Injectable() 
export class LoginService {
  changes:BehaviorSubject = new BehaviorSubject(false);
}
Run Code Online (Sandbox Code Playgroud)
export class LoginComponent {
  constructor(private loginService:LoginService) {}

  onLogin() {
    this.loginService.changes.next(true);
  }
}
Run Code Online (Sandbox Code Playgroud)
export class NavComponent {
  constructor(private loginService:LoginService) {}

  onLogin() {
    this.loginService.changes.subscribe(status => this.isLoggedIn = status);
  }
}
Run Code Online (Sandbox Code Playgroud)