Трансляция события в Angular 6 / Typescript

У меня такая структура:

<app>
  <test-a></test-a>
  <test-b></test-b>
</app>

@Component({
    selector: 'app',
    templateUrl: './app.component.html',
})
export class AppComponent {
}    

@Component({
    selector: 'test-a',
    templateUrl: './testa.component.html',
})
export class TestAComponent {
}

@Component({
    selector: 'test-b',
    templateUrl: './testb.component.html',
})
export class TestBComponent {
}

Test B содержит выбираемые элементы. Когда один из них выбран, я хотел бы сообщить тесту A, что этот элемент был выбран ...

Я думаю, что есть 2 варианта, которые, как я знаю, могут достичь этого.

  • Используйте App для сохранения выбранного элемента. Измените этот выбранный элемент в Test B, а затем позвольте Test A реагировать ... но он создает уродливая тугая связь между компонентами Test A и Test B ... и родительским компонентом App. Мне не нравится эта идея.
  • Чтобы создать своего рода службу «подписчик событий», которая хранит массив различных Observable, на которые можно подписаться. Моя текущая реализация здесь (не закончена):

// Модель, необходимая для моего собственного класса

export class KeyValuePair<T>
{
    public key: string;
    public value: T;

    construct(key: string, value: T) {
        this.key = key;
        this.value = value;
    }
}

// Как может выглядеть моя реализация (wip)

import { Observable, of } from "rxjs";
import { KeyValuePair } from "../models/keyvaluepair";
import { Injectable } from "@angular/core";

@Injectable({
    providedIn: 'root',
})
export class EventService<T>
{
    protected subscriptions: KeyValuePair<Observable<T>>[];

    public Broadcast(key: string, value: any)
    {
        var observable = new Observable<T>();
        observable.subscribe((a) =>
        {
            return of(value);
        });

        this.subscriptions.push(
            new KeyValuePair<Observable<T>>(
                key, 
                observable
            )
        );
    }

    public Subscribe(key: string): Observable<T>
    {
        var observable = this.subscriptions.find((sub) => {
            return sub.key == key;
        });

        return observable.value;
    }
}

// Как вы можете создать событие

this.testEventService.Broadcast("itemSelected", item);

// Как это можно использовать

this.testEventService.Subscribe("itemSelected").subscribe((item) => {
    this.changeItem(item);
});

Однако, конечно, мне не стоило писать это ...? В angularjs и jquery были вещи типа $ broadcast и $ on, которые сделали жизнь такой простой ... что мне здесь не хватает? Есть ли более простой способ в angular 6 и машинописном тексте?

Редактировать:

Я сделал сервис, которым могут пользоваться люди, скажите, отстойно ли это: https://jsfiddle.net/jimmyt1988/oy7ud8L3/

Думаю, вы можете упростить, могу помочь, если вам интересно.

izmaylovdev 12.06.2018 16:54
Тестирование функциональных 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
2
1
9 845
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

вы можете использовать Предмет

export class EventService<T> {
    protected _eventSubject = new Subject();
    public events = this._eventSubject.asObservable();

    dispathEvent(event) {
       this._eventSubject.next(event);
    }
}

и вы можете использовать eventService.events.subscribe(event => {...}) и eventsService.dispatchEvent(event)

izmaylovdev 11.06.2018 02:55

как бы выглядело событие в этом случае?

Jimmyt1988 11.06.2018 02:59

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

Jimmyt1988 11.06.2018 03:02

все, что вы хотите, в вашем случае вы можете использовать что-то вроде redux Action - { action: 'itemSelected', payload: {} }

izmaylovdev 11.06.2018 03:02

вы также можете создавать селекторы различий из этой темы public itemSelectedEvents = this.events.pipe( filter(e => e.action === 'itemSelected'), map(e => e.payload) )

izmaylovdev 11.06.2018 03:04

"чтобы я мог хранить разные события с разными данными?" - Да, ты можешь.

izmaylovdev 11.06.2018 03:10

Спасибо за помощь. Я попробую, когда вернусь с работы, и поставлю вам галочку, когда заставлю работать. Спасибо чувак!

Jimmyt1988 11.06.2018 10:57

Спасибо, я тоже читал по предметам. идеальный выбор для работы. Странно, что для этого нет готового сервиса. пришлось создать все самому :(

Jimmyt1988 11.06.2018 23:36

Я добавил свою последнюю реализацию службы в OP. Спасибо за вашу помощь.

Jimmyt1988 12.06.2018 00:05

вот моя реализация для этой службы jsfiddle.net/izmaylovdev/3ybxwuas/13

izmaylovdev 12.06.2018 17:18

Понятно, в субъекте может быть несколько объектов. Хорошо знать! Спасибо. Большое спасибо, чувак!

Jimmyt1988 13.06.2018 01:09

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