import { Injectable, OnDestroy } from "@angular/core"; import { BehaviorSubject } from "rxjs/BehaviorSubject";
@Injectable() export class ClinicalFilteringService implements OnDestroy {
private filtersSource = new BehaviorSubject<any>({});
filters = this.filtersSource.asObservable();
private savedSearchesSource = new BehaviorSubject<any>({});
savedSearches = this.savedSearchesSource.asObservable();
setFilters(name, filter){
let currentFilter = this.filtersSource.getValue();
currentFilter[name] = filter;
if(currentFilter[name].length === 0){
delete currentFilter[name];
}
this.filtersSource.next(currentFilter);
}
saveSearches(filters, name){
let currentSavedSearches = this.savedSearchesSource.getValue();
currentSavedSearches[name] = filters;
this.savedSearchesSource.next(currentSavedSearches);
}
}
Я новичок в angular, у меня проблемы с BehaviourSubject.Таким образом, у меня есть 2 BehavioralSubject, которые filtersSource
и savedSearchesSource
.savedSearchesSource
будет обновляться при событии щелчка, а filtersSource
будет обновляться при фильтрации события на графике.Проблема в том, что каждый раз, когда я вызываю setFilters setFilters
для обновления filtersSource
, он также обновляет значение this.savedSearchesSource.getValue()
.Я не уверен, почему это происходит.
Вот компонент, который с помощью службы
import { Component, OnDestroy, ChangeDetectorRef, OnInit } from '@angular/core';
import { Auth } from '../../../services/auth-service';
import { Subscription } from 'rxjs/Subscription';
import { Params, ActivatedRoute, Router } from '@angular/router';
import { SearchBarService } from '../../../services/search-bar-service';
import { GenericAutocompleteResult } from '../../../model/autocomplete-result';
import { MatSnackBar, MatSnackBarRef } from '@angular/material';
import { SnackbarDemoComponent } from '../../parts/snackbar-demo/snackbar-demo.component';
import { ClinicalFilteringService } from '../../../services/clinical-filtering.service';
import { HelperService } from '../../../services/helper.service';
const SMALL_WIDTH = 720;
@Component({
selector: 'app-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.css'],
providers: [SearchBarService]
})
export class SearchComponent implements OnInit {
subscriptions: Subscription[] = [];
sbSub: Subscription = null;
autocomplete: GenericAutocompleteResult<any>;
error = '';
searching = false;
sb: MatSnackBarRef<SnackbarDemoComponent> = null;
filters = {};
objectKeys= Object.keys;
private mediaMatcher: MediaQueryList = matchMedia(`(max-width: ${SMALL_WIDTH}px)`);
constructor(public searchBarService: SearchBarService,
public auth: Auth,
private route: ActivatedRoute,
private cd: ChangeDetectorRef,
public snackBar: MatSnackBar,
private router: Router,
private clinicalFilteringService: ClinicalFilteringService,
private helper: HelperService,
) {
if (auth.authenticated()) {
this.subscriptions.push(route.params.subscribe(p => this.parseParams(p)));
}
}
ngOnInit(): void {
this.clinicalFilteringService.filters.subscribe(filter => this.filters = filter)
}
ngOnDestroy() {
this.subscriptions.forEach((s => s.unsubscribe()));
}
handleError(e: string) {
this.error = e;
}
deleteFilter(name: string){
return this.clinicalFilteringService.deleteFilter(name);
}
saveSearches(name){
return this.clinicalFilteringService.saveSearches(name);
}
}
продолжает изменять this.filters
, где он используется в качестве параметра для функции службы.Буду признателен за любую помощь в решении этой проблемы.