Как разделить сервис между двумя модулями в angular2
В моем приложении два разных модуля (@NgModule) работают независимо друг от друга, и теперь я хочу, чтобы они общались друг с другом и обменивались данными. Два модуля загружаются лениво. Как отразить изменения службы от модуля 1 до модуля 2
1 ответ
Создайте SharedModule и введите SharedService в массиве провайдеров, как показано ниже
import { CommonModule } from '@angular/common';
import { SharedService } from './shared.service';
@NgModule({
imports: [
FormsModule,
CommonModule
],
exports: [
]
})
export class SharedModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: [SharedService]
};
}
}
И создайте SharedService, как показано ниже, с bookTitleOrAuthorSearchEvent EventEmitter
import { Injectable, Inject, EventEmitter } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class SharedService {
public bookTitleOrAuthorSearchEvent = new EventEmitter<string>();
}
и введите SharedModule в app.module, как для forRoot, как показано ниже
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { SharedModule } from './modules/shared/shared.module';
@NgModule({
declarations: [
AppComponent,
//..
],
imports: [
//..
SharedModule.forRoot()
],
providers: [
//...
],
bootstrap: [AppComponent]
})
export class AppModule { }
и Inject sharedService в любом компоненте вашего модуля, а экземпляр sharedService доступен во всех компонентах любых модулей, и вы можете использовать EventEmitter или BehaviorSubject для передачи данных и захвата их, где это требуется, как показано ниже
import { Component, OnInit, DoCheck, ViewEncapsulation } from '@angular/core';
import { SharedService } from './../shared/shared.service';
@Component({
selector: 'app-anytime-lib',
templateUrl: './anytime-lib.component.html',
styleUrls: ['./anytime-lib.component.css'],
encapsulation: ViewEncapsulation.None
})
export class AnytimeLibComponent implements OnInit, DoCheck {
constructor(private sharedService: SharedService) {
}
ngOnInit() {
this.clearSession();
}
clearSession() {
// this.sharedService.removeSessionItem('userInfo');
}
ngDoCheck() {
this.sharedService.bookTitleOrAuthorSearchEvent.subscribe((data) => {
console.log('Emitted data', data);
});
}
}