При передаче данных между компонентами, которые не имеют прямого соединения, такими как братья и сестры, внуки и т. Д., Вы должны использовать общую службу.Вы можете использовать RXJS BehaviorSubject
или Subject
для межкомпонентной связи.
Subject vs BehaviorSubject
Создание службы
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable()
export class SharedService {
private valueSource = new BehaviorSubject<boolean>(false);
currentValue = this.valueSource.asObservable();
constructor() { }
changeValue(value: boolean) {
this.valueSource.next(value)
}
}
Регистрация службы с угловым модулем.
Зачем?Если мы хотим, чтобы экземпляр зависимости использовался глобально и совместно использовать state
в приложении, мы настроим его на NgModule.
из Angular Docs
Поставщики угловых модулей (@NgModule.providers)
зарегистрированы в корневом инжекторе приложения.Angular может внедрить соответствующие сервисы в любой класс, который он создает.После создания экземпляр службы живет в течение всего жизненного цикла приложения, и Angular внедряет этот один экземпляр службы в каждый класс, который в этом нуждается.
@NgModule({
declarations: [
AppComponent,
],
imports: [
BrowserModule,
BrowserAnimationsModule,
],
providers: [SharedService],
bootstrap:[AppComponent],
Добавление службы SharedService в компоненты
app.component.ts:
export class AppComponent {
public isValid:boolean;
constructor(private router:Router:private service:SharedService){
this.service.currentValue.subscribe(message => this.isValid = message);//subscribe to the currentValue observable.
}
logout(){
localStorage.removeItem('email');
this.router.navigate(['./login']);
this.isValid=true;
}
login.component.ts
export class LoginComponent implements OnInit {
public username:string;
public password:string;
public isValid:boolean;
constructor(private router:Router,private service:SharedService) {}
ngOnInit() {
}
userLogin(form:NgForm){
if(form.value.username==="admin@gmail.com" && form.value.password==="admin")
{
localStorage.setItem('email',form.value.username);
this.router.navigate(['./php']);
this.isValid=false;
this.service.changeValue(this.isValid);//it calls next on the BehaviorSubject to change its value.
} } }