Как запомнить значение переменной Angular?

Всем привет! Скорее всего делаю, что-то не так.

Есть каталог новостей. Новости получаю с сервера в json формате. Создаю subject переменные в сервисах, подписываюсь в компонентах. Так же есть компонент для фильтрации новостей по разделам. Разделы прилетают с сервера вместе с новостями. Все хранится в сервисах.

Проблема следующая. Когда перехожу в детальный просмотр новости, и возвращаюсь обратно, почему-то затираются переменные, которые должны содержать список разделов для фильтра и новости. И подписка на Subject переменные не отрабатывает.

Код сервиса новостей
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { SectionsService } from './sections.service';

@Injectable({
  providedIn: 'root',
})

export class NewsService {
  item: [] = [];
  news: any[] = [];

  activeNews = new Subject<any[]>();

  constructor(private sectionsService: SectionsService) {
    this.sectionsService.activeSection.subscribe(section => {
      if (section != "") {
        this.activeNews.next(this.news.filter(items => items.name_section === section));
      } else {
        this.activeNews.next(this.news);
      }
    })
  }

  public newsesList(list: []) {
    this.item = list;
  }

  public listItems(items: any) {
    this.news = items;
    this.sectionsService.getSections(items);
    this.activeNews.next(items);
  }
}


Код компонента:
import { Component, OnInit } from '@angular/core';
import { NewsService } from '../news.service';

@Component({
  selector: 'app-news-list',
  templateUrl: './news-list.component.html',
  styleUrls: ['./news-list.component.scss']
})
export class NewsListComponent implements OnInit {

  nameComponent: string= "News list message: ";
  
  newsActive: any[] = [];

  colNews: number = 9;

  constructor(private newsesService: NewsService) {}

  ngOnInit(): void {
    this.newsesService.activeNews.subscribe(newses => {
      this.newsActive = newses;
    })
  }

  activeElement(item: []): void {
    this.newsesService.newsesList(item);
  }

  addNews(): void {
    this.colNews = this.colNews + 9;
  }
}


Если поможете решить проблему, с новостями, то смогу решить проблему с фильтром самостоятельно.
  • Вопрос задан
  • 337 просмотров
Решения вопроса 1
lssssssssssl
@lssssssssssl
Я, например, делаю такой сервис для хранения стейта текущей страницы.
@Injectable({
  providedIn: 'root'
})
export class DashboardStateService {

  private contentPage = new BehaviorSubject<number>(1);

  public changeContentPage(page: number): void {
    this.contentPage.next(page);
  }
  public getContentPage(): number {
    return this.contentPage.getValue()
  }
}


Соответственно потом в компоненте можно вот так получать:
async ngOnInit() {
    this.currentPage = this.dashboardStateService.getContentPage()
  }

Ну или изменять страницу в удобном месте методом this.dashboardStateService.changeContentPage(2)

Можно адаптировать и под хранение состояния фильтров да и чего угодно в принципе.

p.s. Писал сразу от руки, может где-то ошибка в синтаксисе есть.
p.s.s. Ну вообще, думаю, есть способ гораздо лучше, ежели тот, который я написал, выглядит не очень.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
getData() {
  return this.http.get(url).pipe(shareReplay())
}


и не надо ничего лишнего городить, никаких сабжектов
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы