Angular 2 - 从服务到同一级别组件的事件
Angular 2 - Event from service to component at same level
我有一个可以发出事件的身份验证服务。当用户登录时(通过 LoginComponent),必须更新导航栏 (NavBarComponent)。这些组件处于同一级别
首先我尝试使用 EventEmitter,然后我了解到我们不应该在服务中使用它。那是一种反模式。
所以我尝试了https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
auth.service.ts
import {Injectable} from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class AuthService {
private connectionState: boolean;
private stateChangeSource = new Subject<boolean>();
// Observable boolean stream
stateChange$ = this.stateChangeSource.asObservable();
constructor(private http: Http) {
}
changeConnectionState() {
this.stateChangeSource.next(!this.connectionState);
}
}
login.component.ts
import {Component, Inject} from '@angular/core';
import {AuthService} from './auth.service';
@Component({
selector: 'login-component',
templateUrl: './login.component.html'
})
export class LoginComponent {
constructor(private authService: AuthService) {
this.authService = authService;
}
login () {
this.authService.changeConnectionState();
}
}
navbar.component.ts
import {Component} from '@angular/core';
import {AuthService} from './auth.service';
@Component({
selector: 'navbar',
templateUrl: './navbar.component.html',
providers: [AuthService]
})
export class NavbarComponent {
authService: AuthService;
connectionState: boolean;
subscription: any;
constructor(private authService: AuthService) {
this.authService = authService;
this.subscription = authService.stateChange$.subscribe(
value => {
this.connectionState = value;
})
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
navbar.component.html
<nav class="navbar navbar-default navbar-fixed-top">
...
<a *ngIf="!connectionState" [routerLink]="['/login']">Connect</a>
<a *ngIf="connectionState" (click)="disconnect()">Disconnect</a>
...
</nav>
当我打电话给
this.authService.changeConnectionState();
在 NavbarComponent 中,导航栏已正确更新。
但我想从 loginComponent 更改连接状态,然后更新导航栏。我该怎么办?
编辑 :
在 NavBarComponent 中收到事件:
this.subscription = authService.stateChange$.subscribe(
value => {
this.connectionState = value;
})
但是模板中的值没有更新。我必须更改路线才能获得 'connectionState'
的正确值
如果组件处于同一级别,则您无法在它们之间共享其中一个组件提供的服务。
您需要在共同的祖先组件或 non-lazy-loaded @NgModule()
上提供共享服务
我不得不删除
providers: [AuthService]
来自 Navbar.component.ts
我的app.module.ts
已经设置好了
@NgModule({
imports: [
BrowserModule
],
declarations: [
LoginComponent
],
providers: [
AuthService
],
bootstrap: [AppComponent]
})
export class AppModule {
}
由于我对登录的异步调用(未在此 post 中详细说明),我遇到了另一个错误,我不知道为什么。但这不是主题。
我有一个可以发出事件的身份验证服务。当用户登录时(通过 LoginComponent),必须更新导航栏 (NavBarComponent)。这些组件处于同一级别
首先我尝试使用 EventEmitter,然后我了解到我们不应该在服务中使用它。那是一种反模式。
所以我尝试了https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
auth.service.ts
import {Injectable} from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class AuthService {
private connectionState: boolean;
private stateChangeSource = new Subject<boolean>();
// Observable boolean stream
stateChange$ = this.stateChangeSource.asObservable();
constructor(private http: Http) {
}
changeConnectionState() {
this.stateChangeSource.next(!this.connectionState);
}
}
login.component.ts
import {Component, Inject} from '@angular/core';
import {AuthService} from './auth.service';
@Component({
selector: 'login-component',
templateUrl: './login.component.html'
})
export class LoginComponent {
constructor(private authService: AuthService) {
this.authService = authService;
}
login () {
this.authService.changeConnectionState();
}
}
navbar.component.ts
import {Component} from '@angular/core';
import {AuthService} from './auth.service';
@Component({
selector: 'navbar',
templateUrl: './navbar.component.html',
providers: [AuthService]
})
export class NavbarComponent {
authService: AuthService;
connectionState: boolean;
subscription: any;
constructor(private authService: AuthService) {
this.authService = authService;
this.subscription = authService.stateChange$.subscribe(
value => {
this.connectionState = value;
})
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
navbar.component.html
<nav class="navbar navbar-default navbar-fixed-top">
...
<a *ngIf="!connectionState" [routerLink]="['/login']">Connect</a>
<a *ngIf="connectionState" (click)="disconnect()">Disconnect</a>
...
</nav>
当我打电话给
this.authService.changeConnectionState();
在 NavbarComponent 中,导航栏已正确更新。 但我想从 loginComponent 更改连接状态,然后更新导航栏。我该怎么办?
编辑 :
在 NavBarComponent 中收到事件:
this.subscription = authService.stateChange$.subscribe(
value => {
this.connectionState = value;
})
但是模板中的值没有更新。我必须更改路线才能获得 'connectionState'
的正确值如果组件处于同一级别,则您无法在它们之间共享其中一个组件提供的服务。
您需要在共同的祖先组件或 non-lazy-loaded @NgModule()
我不得不删除
providers: [AuthService]
来自 Navbar.component.ts
我的app.module.ts
已经设置好了@NgModule({
imports: [
BrowserModule
],
declarations: [
LoginComponent
],
providers: [
AuthService
],
bootstrap: [AppComponent]
})
export class AppModule {
}
由于我对登录的异步调用(未在此 post 中详细说明),我遇到了另一个错误,我不知道为什么。但这不是主题。