В настоящее время наша команда разработала простое угловое 6 приложение с несколькими компонентами, и они работают правильно, но мы знаем, что эти компоненты уже слишком связаны друг с другом (они слишком много знают о себе).Естественно, мы хотим перейти к разделению решений, таких как популярная шина событий / сообщений внутри приложения angular 6.
Поэтому компоненты, вместо того, чтобы подписываться друг на друга, должны знать только о шине messa ge и заботиться только о том, что публикуется вшина и подписка на него.
Этот пример реализации основан на классе Subscription , но в соответствии с лучшим вариантом для Интернета было бы использовать BehaviorSubject .
Итак, у меня есть несколько вопросов:
стоит ли менять Subscription -> BehaviorSubject?
- Лучше ли иметь список подписок вместо одного сейчас?
- Как установить начальное значение для подписки при подписке?
- Если я хочу избавиться от канала и хотел быиспользовать что-то еще, например, пространство имен класса сообщения, так как это можно получить?Это хороший подход?
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;
})
);
}
}