Как загрузить данные в службу Angular в два компонента одновременно?

У меня есть угловой компонент, который загружает клиента из базы данных с помощью службы. Вместо того, чтобы возвращаться к базе данных для каждого компонента, я кэширую эти данные в службе как выбранный клиент.

export class ClientService {
  Clients: Client[];

  constructor() {
    this.Clients = [
      {
        client:  0,
        name: "Fred",
        street: "Brockton Drive",
        address1: null,
        address2: null,
        city: "SomewhereVille",
        zipcode: "1234"
        },
        {
          client:  1,
          name: "Wilma",
          street: "Somerset Drive",
          address1: null,
          address2: null,
          city: "Elsewhere",
          zipcode: "0987"
          },
    ]
   }

  setCurrentClient(id: number) {
    var client = this.Clients[id];
    console.info(client);
    this.selectedClient.next(client);

  }

  readonly selectedClient: Subject<Client> = new Subject<Client>()

}

Затем в клиентском компоненте я подписываюсь на параметры маршрута и говорю клиентской службе загрузить клиент и установить selectedClient.

export class ClientComponent implements OnInit {

  constructor(private route: ActivatedRoute, private router: Router, private clientService: ClientService) {
    console.info("order component activated");

      route.paramMap.subscribe((params: ParamMap) => {
        const cid = params.get("id");
        if (cid)
          clientService.setCurrentClient(Number.parseInt(cid));
        else
          this.selectedClient = undefined;
      })
     clientService.selectedClient.subscribe((data) => this.selectedClient = data)

  }

  selectedClient?: Client;

  ngOnInit(): void {
  }
}

Затем в компоненте «Сведения о клиенте» я подписываюсь на клиентскую службу — выбранный клиент. Это та часть, которая не работает. Поскольку детали не заполняются.

export class ClientDetailsComponent implements OnDestroy {


  ClientForm: FormGroup;
  token?: Subscription;

  constructor(private clientService: ClientService, private formBuilder: FormBuilder) {

    this.ClientForm = this.formBuilder.group<Client>(new Client());
     this.token = this.clientService.selectedClient.subscribe((data) => {
      this.selectedClient = data;
      this.ClientForm.setValue(this.selectedClient);
      console.info("Client activated");
    })
  }

  ngOnDestroy(): void {
    if (this.token) this.token.unsubscribe();

  }

  selectedClient?: Client;

  onSubmit(): void {

  }


}

Что я делаю неправильно или против лучших практик, из-за чего это не работает?

P.S. есть пример stackblitz - https://stackblitz.com/github/PhoenixStoneham/TabDataVanishing

Почему у вас есть роутер-выход в client.component. Не проще ли было бы просто включить их в качестве компонентов, которым вы передаете данные с помощью декоратора @Input? Ваша проблема в том, что тема асинхронна и недоступна, когда вы показываете свои данные.

user796446 29.03.2023 19:24

Для простоты я удалил весь код базы данных и использую этот массив в качестве заполнителя для примера. Предположим, что метод setclient обычно обращается к базе данных асинхронно.

Phoenix Stoneham 29.03.2023 19:26

@E.Maggini, потому что в этой группе вкладок будут не только данные клиента. Там же будет список всех их заказов, возможно финансовые данные и прочее. Поэтому я использую маршрутизацию, чтобы гарантировать, что когда я хочу открыть заказ для клиента, мне не нужно будет его добавлять.

Phoenix Stoneham 29.03.2023 19:31

вам не нужно было бы «добавлять», если у вас уже есть эти данные в объекте, хранящемся в клиенте. Просто передайте его с помощью @Input. Вот так может? Ultimatecourses.com/blog/passing-data-angular-components-inp‌​ut

user796446 29.03.2023 19:37

@ E.Maggini, вы можете запустить пример stackblitz и посмотреть на html и маршрутизацию клиентского компонента.

Phoenix Stoneham 29.03.2023 20:20
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
5
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ты был почти там. Проблема в том, что вы используете тему, а не тему поведения.

Это означает, что он получит следующее значение только после того, как начнет прослушивание.

Таким образом, клиент, который был выбран, не будет иметь своего значения в деталях клиента, потому что он не будет выдавать никакого значения.

Я попробую это утром

Phoenix Stoneham 29.03.2023 19:32

Я бы посоветовал вам использовать ngrx и определить Store.

  • всякий раз, когда вы делаете вызов API, вы обновляете состояние хранилища. Все компоненты, подписанные на свойство в магазине, получат результат.

Другие вопросы по теме