Угловая шина 6 сообщений
В настоящее время наша команда разработала простое приложение angular 6 с несколькими компонентами, и они работают правильно, но мы знаем, что эти компоненты уже слишком связаны друг с другом (они слишком много знают о себе). Естественно, мы хотим перейти к разделению решений, таких как популярная шина событий / сообщений внутри приложения angular 6.
Таким образом, компоненты, вместо того, чтобы подписываться друг на друга, должны знать только о шине Messa Ge и заботиться только о том, что опубликовано в шине и подписано на нее.
Этот пример реализации основан на классе подписки, но в соответствии с интернет-решением лучше использовать BehaviorSubject.
Итак, у меня есть несколько вопросов:
стоит ли менять Subscription -> BehaviorSubject?
- Лучше ли иметь список подписок вместо одного сейчас?
- Как установить начальное значение для подписки при подписке?
- Если я хочу избавиться от канала и хочу использовать что-то еще, например, пространство имен класса сообщений, то как его можно получить? Это хороший подход?
import {Injectable} из '@angular/core'; import { Observable, Subject } из 'rxjs/Rx'; import { filter, map } из 'rxjs/operator';
Интерфейс экспорта IClassConstructor { new (...args: any[]): T; }
интерфейс экспорта IMessage {канал: функция; содержание: любое; } /** простая основанная на классах шина сообщений публикации / подписки для обеспечения разъединенной передачи событий, действий, команд * / @Injectable () export class 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; }) ); }
}