угловая шина 6 сообщений - PullRequest
       5

угловая шина 6 сообщений

0 голосов
/ 12 февраля 2019

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

Поэтому компоненты, вместо того, чтобы подписываться друг на друга, должны знать только о шине messa ge и заботиться только о том, что публикуется вшина и подписка на него.

Этот пример реализации основан на классе Subscription , но в соответствии с лучшим вариантом для Интернета было бы использовать BehaviorSubject .

Итак, у меня есть несколько вопросов:

  1. стоит ли менять Subscription -> BehaviorSubject?

  2. Лучше ли иметь список подписок вместо одного сейчас?
  3. Как установить начальное значение для подписки при подписке?
  4. Если я хочу избавиться от канала и хотел быиспользовать что-то еще, например, пространство имен класса сообщения, так как это можно получить?Это хороший подход?

import {Injectable} из '@ angular / core';import {Observable, Subject} из 'rxjs / Rx';import {filter, map} из 'rxjs / operator';

интерфейс экспорта IClassConstructor {new (... args: any []): T;}

интерфейс экспорта IMessage {канал: функция;содержание: любое;} / ** простая основанная на классе шина сообщений публикации / подписки для обеспечения разъединенной передачи событий, действий, команд * / @Injectable () класс экспорта MessageService {private message = new Subject ();

public publish<T>(messageInstance: T): void {   // Flux/Redux: 'dispatch'
    const channel = messageInstance.constructor;
    this.message.next({'channel': channel, 'content': messageInstance}); // Redux: {'type': string, 'payload': any }
}

public subscribe<T>(messageClass: IClassConstructor<T>): Observable<T> {
    const channel: IClassConstructor<T> = messageClass;
    return this.message.pipe(
        filter((message: IMessage) => {
            return message.channel === channel;
        }),
        map((message: IMessage) => {
            return message.content;
        })
    );
}

}

...