@PatriotSY

Можно ли как-то разом изменить свойство у всех экземпляров класса?

Добрый вечер!
Делаю в ангуляре дерево, и столкнулся таким вопросом: можно ли как-то изменить свойство у всех объектов одного класса? Есть класс:
export class Item {
public expand = false;
}


Нужно изменить expand сразу всех объектов. Можно пробежаться рекурсивно по дереву foreach'ем и изменить у каждого персонально, но может есть какая-то магия, что бы разом у всех изменить? Элементов очень много.
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
Думаю правильнее будет создать сервис ItemsTreeService. В сервисе в ReplaySubject записать состояние - свернуто ли всё. Компонент инжектит в себя этот сервис и следит за isAllCollapsed. Если нужно всё свернуть - collapseAll() у сервиса, который будет this.isAllCollapsedRef.next(true) записывать новое значение в наше Observable свойство у сервиса.

@Injectable({
  providedIn: "root"
})
export class ItemsTreeService {
  private readonly isAllCollapsed$ = new ReplaySubject<boolean>(1);

  public collapseAll() {
    this.isAllCollapsed.next(true);
  }

  public isAllCollapsed() {
    return this.isAllCollapsed$.asObservable();
  }
}

@Component({
  template: `
    <div *ngIf="isExpanded | async">
      // content
    </div>
  `
})
export class ItemTreeNodeComponent implements OnInit {
  public readonly expandRef = new BehaviorSubject<boolean>(false);
  public isExpanded: Observable<boolean>;

  constructor(private readonly itemsTreeService: ItemsTreeService) {}

  public ngOnInit() {
    this.isExpanded = this.expandRef.asObservable().pipe(
      combineLatest(this.itemsTreeService.isAllCollapsed()),
      map(([expanded, allCollapsed]) => /* в зависимости от того, что вам пришло, решаете открыть вам ваш айтем или нет */)
    );
  }

  public expand() {
    this.expandRef.next(true);
  }

  public collapse() {
    this.expandRef.next(false);
  }
}


Но я бы не стал мешать подобное поведение в компонент Item, если он завязан на бизнесслогике. Лучше сделать отдельный модуль для дерева, чтобы его можно было переиспользовать. Есть готовое дерево: https://material.angular.io/components/tree/overview.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Robur
@Robur
Знаю больше чем это необходимо
Кратко: Нет.

Длинно:
1. Можно нагородить синтаксического сахара, чтобы получилось например `Item.expandAll()`, но внутри будет то же самое бегание по всем объектам.
2. можно это свойство положить в прототип так что оно будет одно на всех, и будет меняться разом для всех.
Но все Item будут или expand=true или expand=false всегда и смысла в этом как-то немного.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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